node js 里面for循环使用
发布于 7 年前 作者 quanpf2481 7315 次浏览 来自 问答

node js 里面都是异步执行的,在写一个for循环的时候,怎么一让当前这一次循环执行完之后,再进行下一次执行呢????

8 回复

可以用闭包,不过你说的这种需求,一般都有其他方法实现的,比如async.map。你可以说的具体点。

尾递归,是最基础的一种,不过楼上的方法以及使用 ES6/7 解决方案才好

@qujinxiong 比如说一个for循环里面,当i=0的时候,执行一次,但是执行的内容还没有执行完,就会执行下一次循环,怎么样控制让当前这次循环执行完之后,再执行下一次循环呢???

@qujinxiong 你说的闭包,是指用foreach吗???

@DevinXian 尾递归???能不能说的详细一点,或者有没有什么参考文档之类的???谢谢

异步流程控制 用async模块实现 如果node版本是8.x 可以使用高级的async/await方式实现

问题应该是:异步流程控制中的顺序执行问题

三种方法: 1.基于回调 2.基于 Promise 3.async/await <-- 终极解决方法

下面代码楼主拿去玩玩

const asyncTask = (i, callback) => {
  let timer = setTimeout(() => {
    console.log(i)
    callback()
  }, Math.random() * 1000)
}
// promisify
const asyncTaskP = i => new Promise(resolve => {
  asyncTask(i , resolve)
})

/* 方法一 */
const method1 = n => {
  const next = i => {
    if(i >= n) return
    asyncTask(i, () => {
      i++
      next(i)
    })
  }
  next(0)
}

/* 方法二 */
const method2 = n => {
  let promise = asyncTaskP(0)
  for(let i = 1; i < n; i++){
    promise = promise.then(() => asyncTaskP(i))
  }
  promise.then()
}

/* 方法三 */
const method3 = async n => {
  for(let i = 0; i < n; i++){
    await asyncTaskP(i)
  }
}

method1(5)

@quanpf2481 你能理解闭包就自然知道怎么解决这个问题了。

var arr = [1,2,3]
for(var i=0;i<arr.length;i++){
var foo = function (i) {
    User.findOne({user_id:152+i},function (err, user) {
        if(err) console.log(err);
        console.log('ussserrr:'+i,user)
    })
}(i)
}
回到顶部