在node.js async模块的forEachOf方法中没有调用可选的回调

时间:2015-06-28 07:17:34

标签: javascript node.js asynchronous callback async.js

我使用异步模块的forEachOf方法在迭代对象后打印最终结果。这是我正在做的缩短版本:

var async = require('async'),
    cheerio = require('cheerio'),
    request = require('request');

var returnArray = [];

async.forEachOf(myObj, function (value, key, callback) {
    var anotherObj = {};

    anotherObj.type = "val1";

    request(someurl, function(err, res, body) {
        if (err) {
            return callback(err);
        }

        var $ = cheerio.load(body);

        anotherObj.name = "val2";

        var miniObj = {};
        $('#some-element', "#an-id").each(function(i, value) {
            var val = value.value;
            miniObj[size] = val;
        });

        anotherObj.miniObj = miniObj;

        returnArray.push(anotherObj);

        return callback();
    });
}, function (err) {
    if (err) {
        console.error(err.message);
    }

    console.log(returnArray);
});

然而,当我运行该程序时,没有任何内容(即' returnArray')会像应该的那样打印到控制台。

作为参考,我看过其他类似的帖子:

我不确定我在这里做错了什么。谁能指出我做错了什么?

谢谢!

编辑:所以我想我终于弄清楚我做错了什么。在我之前提供的另一个示例HERE, using Runnable中,我忘了添加一个'返回回调()'声明。然后它奏效了。这个和这个例子的唯一区别在于我的回复()'上面提供的示例中的语句本身在另一个异步方法中调用。我认为为了解决我的问题,我将以某种方式确保(可能在异步库中使用一些控制流功能)来调用'返回callback()'在正确的范围/级别'第二个异步方法完成后。我想我会将这个,我的错误归因于缺乏关于正确使用' return callback()'异步文档中的语句。一旦我弄明白,我会用一个解决方案更新这篇文章(然后赶上一些睡眠)!

1 个答案:

答案 0 :(得分:-2)

您的陈述:

if (err) {
    return callback(err);
}

对异步编程无效。相反,你应该这样做:

if(err) callback(err);

这就是为什么你没有得到任何回报。我用应用的异步概念重写了你的代码:

var async = require('async'),
var cheerio = require('cheerio'),
var request = require('request');

var returnArray = [];
async.forEachOf(myObj, function (value, key, next) {
    var anotherObj = {};

    anotherObj.type = "val1";

    request(someurl, function(err, res, body) {
        if (err) next(err);

        var $ = cheerio.load(body);

        anotherObj.name = "val2";

        var miniObj = {};
        async.each($('#some-element', "#an-id"), function (value, next) {
          var val = value.value;
          miniObj[size] = val;
        });

        anotherObj.miniObj = miniObj;

        returnArray.push(anotherObj);

        next();
    });
}, function (err) {
    if (err) console.error(err.message);

    console.log(returnArray);
    callback(returnArray);

});

请注意,您有两个不同的命名回调。外部函数回调称为callback。内部函数回调称为next