-->

可选的回调不被称为Node.js的异步模块的forEachOf方法(Optional callbac

2019-10-23 12:59发布

我使用的是异步模块的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”)被打印到控制台像它应该是。

作为参考,我已经看过这些,类似的帖子:

  • 使用异步模块触发一个回调,一旦所有文件的读取 (似乎已经过时,使用了错误的方法,并没有解决这个问题)
  • 最后回调使用异步不会被调用 (不解决问题)

我不知道我在做什么错在这里。 任何人都可以请指出我做错了什么?

谢谢!

编辑:所以我觉得我终于想通了,我在做什么错。 在不同的例子我提供早期在这里,用Runnable的我忘了添加“返回回调()”语句。 然后它的工作。 这一点,这个例子是,在上面提供的例子我的“回报的回调()”语句本身另一个异步方法中调用之间的唯一区别。 我认为,为了解决我的问题,我会以某种方式必须确保(可能使用异步的图书馆借了一些控制流函数)来调用“回归回调()”在第二异步方法完成后正确的“范围/水平”。 我想我会这样,我的错误,归因于缺乏文档上的“Return回调()”语句在异步文档的正确使用。 我会更新这个帖子了一个解决方案,一旦我弄明白(赶上一些睡眠)!

Answer 1:

您的发言:

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



文章来源: Optional callback not being called in the node.js async module's forEachOf method