【问题标题】:Node.js using async.forEach with async operationNode.js 使用带有异步操作的 async.forEach
【发布时间】:2015-08-16 12:29:31
【问题描述】:

有一个函数,需要遍历一个数组,对每一项执行异步操作,最后回调给调用者。

我可以获得 async.forEach 工作的基本情况。 当我这样做时,它会起作用

async.forEach(documentDefinitions(), function (documentDefinition, callback) {               
    createdList.push(documentDefinition);
    callback(); //tell the async iterator we're done

}, function (err) {
    console.log('iterating done ' + createdList.length);
    callback(createdList); //tell the calling method we're done, and return the created docs.
});

createdList 的长度是正确的。

现在,我想每次通过循环执行另一个异步操作。所以我尝试将代码更改为以下内容;

function insert(link, callback){
    var createList = [];

    async.each(
       documentDefinitions(), 

       function iterator(item, callback) {
           create(collectionLink, item, function (err, created) {
               console.log('created');
               createdList.push(created);
               callback();
           });
       },

       function (err) {
          console.log('iterating done ' + createdList.length);
          callback(createdList);
       }
    );
}

create() 是我的新异步操作。 现在我得到了一个无限循环,我们似乎从来没有点击过回调(createdList);

我尝试在异步 create() 方法的回调中移动 callback(),但这些都不起作用。

请帮帮我,我陷入了回调地狱!

【问题讨论】:

  • create 回调中移动对callback() 的调用是执行此操作的方法。不知道为什么这对你不起作用。
  • 也不确定。想知道是否是因为回调定义了两次。一次在循环中,再次在包含函数中。不知道它是否变得混乱。
  • 顺便说一句。 async.forEach 和 async.each 有什么区别?
  • 没有区别; forEach 只是 each 的别名。您能否更新您的问题以显示您在 create 回调中使用 callback() 调用的尝试?
  • 更新显示完整功能

标签: javascript node.js asynchronous


【解决方案1】:

将函数更改为以下修复它。

function insert(link, callback){
    var createdList = [];
    async.each(
        documentDefinitions(), 

        function iterator(item, cb) {
            create(collectionLink, item, function (err, created) {
                console.log('created');
                createdList.push(created);
                cb();
            });
        },

        function (err) {
            console.log('iterating done ' + createdList.length);
            callback(createdList);
        }
    );
}

不确定,但我认为将回调的一次出现更改为 cb 就可以了。

这是一个范围界定问题,他们变得混乱了吗?

【讨论】:

    猜你喜欢
    • 2012-05-10
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2020-04-22
    • 2018-02-15
    • 1970-01-01
    • 2017-04-20
    • 2017-03-10
    相关资源
    最近更新 更多