关于node.js循环内的回调函数,请前辈指导
发布于 5个月前 作者 zhangwei19940824 576 次浏览 来自 问答
var list = [{k:1},{k:2},{k:3},{k:4}];
for(i in list){
    var item = list[i];
    A.func(item,function(err,result){
        //如果这个func函数耗时比较长
        //我在此处如何才能获取到传进去的参数item
        console.log(item);//此时输出的item,应该与传进去的不同了
    });
}

还有,循环内部含有回调函数,如何等待所有回调函数执行完成再return 呢

B.func = function(list,callback){
    var i = 0;
    for(i in list){
        var item = list[i];
        A.func(item , function(err,result){
            //等待全部的回调函数执行完成后再进行return
            //这个应该如何实现呢
            i++;
        });
    }
    return callback(i);//在此处这样返回的i应该还是0,
};

请前辈指导!

14 回复

计数、检查、通知

@tulayang 能具体一点吗,我没领悟你的意思。。。

:如何等待所有回调函数执行完成再return 呢

这个情况用 async 很适合

:console.log(item);//此时输出的item,应该与传进去的不同了

你试过没有?item 应该还在 function 的 scope 里,可以直接使用。

用 eventproxy 或者 async。推荐前者。

@leapon 我试过,输出的不是原来的值

@alsotang 谢谢,我学习下这些

@zhangwei19940824

输出的是原来的值

$ cat test1.js 
var list = [{k:1},{k:2},{k:3},{k:4}];
for(i in list){
    var item = list[i];
    console.log('>>> item:', item);
    Afunc(item,function(err,result){
        console.log('item:', item);
    });
}

function Afunc(data, callback) {
    callback(null, 1);
}

$ node test1.js 
>>> item: { k: 1 }
item: { k: 1 }
>>> item: { k: 2 }
item: { k: 2 }
>>> item: { k: 3 }
item: { k: 3 }
>>> item: { k: 4 }
item: { k: 4 }

@leapon 前辈,你看看,是这样子的 var list = [{k:1},{k:2},{k:3},{k:4}]; for(i in list){ var item = list[i]; console.log('>>> item:’, item); Afunc(item,function(err,result){ console.log('item:’, item); }); }

function Afunc(data, callback) {
  setTimeout(function(){return callback(null, 1);},1000);
}

执行结果是:

node try.js

item: { k: 1 } item: { k: 2 } item: { k: 3 } item: { k: 4 } item: { k: 4 } item: { k: 4 } item: { k: 4 } item: { k: 4 }

你的Afunc里又加了一层,那把 item 绑到里层的函数上就可以了。

@leapon 我的意思是让Afunc需要一定时间执行完成,里层只是单纯的返回阿,没关系吧

var howdo = require('howdo');
var list = [{k:1},{k:2},{k:3},{k:4}];

howdo.each(list, function(key, item, done) {
    A.func(item, done);
}).together(function(err, k1, k2, k3, k4) {
    // 做你该做的
});
  A.func(item,function(err,result){
    //如果这个func函数耗时比较长
    //我在此处如何才能获取到传进去的参数item
    console.log(item);//此时输出的item,应该与传进去的不同了
  });

这里如果A.func是一个异步函数,则 item 始终是 list 中的最后一个,可以用一个闭包解决此问题

    (function(item){
      A.func(item,function(err,result){
          console.log(item);//此时输出的item,应该与传进去的相同了
      });
    })(item);

想对一个数组执行异步函数,可以考虑 async 库中的 async.parallel,async.series,async.map 等函数

回到顶部