我使用异步模块的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()'异步文档中的语句。一旦我弄明白,我会用一个解决方案更新这篇文章(然后赶上一些睡眠)!答案 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
。