美文网首页
for循环里面异步操作

for循环里面异步操作

作者: 小小的开发人员 | 来源:发表于2019-04-16 10:35 被阅读0次

  首先来看一个比较简单的问题,我们想实现的每隔1s输出下列数组的值,看下错误写法:

let arr = [1, 2, 3, 4, 5]
 arr.forEach((item) => {
     setTimeout(() => {
         console.log(item)
     },1000)
 })

  会在1s后同时输出1、2、3、4、5,setTimeout定时根本就没有起作用,这是因为:单线程的js在操作时,对于这种异步操作,会先将其进入异步队列,等到整个for循环执行结束后,并且到达了异步执行条件,才会开始执行,setTimeout是写在for循环中的,这5次调用均是在for循环结束后进行的,所以会在异步条件1s到达时,同时执行。

为了避免这种问题,提供几种解决方法。
一般情况下,可以用递归实现,如下:

let arr = [1, 2, 3, 4, 5]
  let index = 0
  function f() {
      if (index >= arr.length) {
          console.log('all Done')
      } else {
          console.log(index)
          index ++
          setTimeout(function () {
              f()
          }, 5000)
      }
  }
  f()

使用async、await实现,可以如下写法:

 let arr = [1, 2, 3, 4, 5]

    let asyncF = function(i) {
      return new Promise(function(resolve, reject) {
          setTimeout(function() {
              console.log(i);
              resolve();
          }, 1000);
      });
  }

  let f = async function() {
      for (let i = 0; i< arr.length; i++) {
          await asyncF(i);
      }
  }
  f()

相关文章

  • for循环里面异步操作

      首先来看一个比较简单的问题,我们想实现的每隔1s输出下列数组的值,看下错误写法:   会在1s后同时输出1、2...

  • iOS、for循环里的异步任务完成再进行其他操作

    for循环里的异步任务完成再进行其他操作 队列组处理for循环里的异步任务

  • 事件循环 Event Loop

    JavaScript 是一门单线程语言,异步操作都是放到事件循环队列里面,等待主执行栈来执行的,并没有专门的异步执...

  • 循环串行异步 Promise

    有时候会有这一种需要,需要在循环中执行一系列操作。但是循环的每次迭代的操作是异步的,此时如何实现“异步串行”呢? ...

  • for循环异步操作问题小结

    在实际开发中,异步总是不可逃避的一个问题,尤其是Node.js端对于数据库的操作涉及大量的异步,同时循环又是不可避...

  • Promise

    Promise是异步里面的一种解决方案,解决了回调嵌套的问题异步操作未完成(pending)异步操作成功(fulf...

  • vuex

    整个流程:首先确保是否有异步请求或者异步操作在整个vuex的流程中,如果有就在actions里面进行操作,在操作之...

  • Promise -- Async container & dec

    基本概念 Promise本质是用于承载异步操作的容器,使得异步操作能够以类似同步的面貌出现,所以then里面内容执...

  • 04-计算限制的异步操作(下)

    [TOC] 计算限制的异步操作(下) 三、Parallel并行循环 3.1 Parallel说明 静态System...

  • 异步操作和事件循环机制(Event Loop)续一

    上一次文章 异步操作和事件循环机制(Event Loop)中我们提到了 EventLoop ,而事件循环机制在 N...

网友评论

      本文标题:for循环里面异步操作

      本文链接:https://www.haomeiwen.com/subject/zcuvwqtx.html