node js 里面for循环使用
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)
}