Javascript node.js异步模块';中未调用可选回调;s forEachOf方法
我使用异步模块的forEachOf方法在遍历对象后打印最终结果。以下是我所做工作的简短版本:Javascript node.js异步模块';中未调用可选回调;s forEachOf方法,javascript,node.js,asynchronous,callback,async.js,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 = {};
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”)像应该的那样打印到控制台
为了便于参考,我查看了其他类似的帖子:
- (似乎过时了,使用了错误的方法,没有解决问题)
- (没有解决这个问题)
if (err) {
return callback(err);
}
对于异步编程无效。相反,您应该:
if(err) callback(err);
这就是为什么你没有得到任何回报。我使用应用的异步概念重写了您的代码:
var async=require('async'),
var cheerio=require('cheerio'),
var请求=要求(“请求”);
var returnArray=[];
forEachOf(myObj,函数(值,键,下一步){
var anotherObj={};
另一个对象j.type=“val1”;
请求(someurl、函数(err、res、body){
如果(错误)下一个(错误);
var$=总负荷(车身);
另一个obj.name=“val2”;
var miniObj={};
async.each($('some element','an id')函数(value,next){
var val=value.value;
miniObj[size]=val;
});
anotherObj.miniObj=miniObj;
returnArray.push(另一个对象);
next();
});
},函数(err){
如果(错误)控制台错误(错误消息);
log(returnArray);
回调(returnArray);
});
请注意,您有两个不同的命名回调。外部函数回调称为
回调
。内部函数回调被称为next
returnObject
vsreturnArray
?哎呀!那只是个打字错误。你的myObj对象的结构是什么?你确定不应该使用“async.each”吗?@LuisDelgado-我以前将myObj打印到控制台上,我绝对确定它采用javascript中典型对象的形式。我还知道,另一个otherobj的构造是正确的,因为当我在forEachOf循环中为它添加一个log语句时,我得到了我希望打印到控制台的内容。@youngrrrrr,好的,我明白了。作为我个人的一点注意,到目前为止,我还没有成功地让async与一个本身具有内部回调async函数的函数配合使用。对于这些情况,我求助于使用类似async.瀑布的东西。异步函数有一个使用请求的内部异步调用。您是否尝试过构建代码,使您的异步函数没有嵌套的异步调用?这是绝对错误的。如果回调不是函数中的最后一个语句,建议使用return callback,在这种情况下,您将得到“callback get called tweep”错误。