CNode

node js 里面for循环使用

问答
Qquanpf2481发布于9 年前最后回复9 年前8 回复8111 浏览0 收藏

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

查看回复

回复 (8)

J
JarvisQJ#1·9 年前

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

D
DevinXian#2·9 年前

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

Q
quanpf2481#3·9 年前
引用 JarvisQJ可以用闭包,不过你说的这种需求,一般都有其他方法实现的,比如async.map。你可以说的具体点。

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

Q
quanpf2481#5·9 年前
引用 DevinXian尾递归,是最基础的一种,不过楼上的方法以及使用 ES6/7 解决方案才好

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

L
leiwei1991#6·9 年前

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

I
ianchn#7·9 年前

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

三种方法: 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)

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

@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)
}
参与回复
登录后即可参与回复。登录