Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js异步模块';中未调用可选回调;s forEachOf方法_Javascript_Node.js_Asynchronous_Callback_Async.js - Fatal编程技术网

Javascript node.js异步模块';中未调用可选回调;s 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 = {};

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

为了便于参考,我查看了其他类似的帖子:

  • (似乎过时了,使用了错误的方法,没有解决问题)
  • (没有解决这个问题)
我不确定我做错了什么。谁能指出我做错了什么

谢谢

编辑:所以我想我终于明白我做错了什么。在前面提供的另一个示例中,我忘记添加“return callback()”语句。然后它成功了。该示例与本示例之间的唯一区别在于,上面提供的示例中的“return callback()”语句本身是在另一个异步方法中调用的。我认为为了解决我的问题,我必须确保(可能使用异步库中的某些控制流函数)在第二个异步方法完成后在正确的“范围/级别”调用“return callback()”。我认为这是我的错误,因为在异步文档中缺少关于正确使用“return callback()”语句的文档。一旦我弄明白了,我会用一个解决方案更新这篇文章(并补上一些睡眠)

您的声明:

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
vs
returnArray
?哎呀!那只是个打字错误。你的myObj对象的结构是什么?你确定不应该使用“async.each”吗?@LuisDelgado-我以前将myObj打印到控制台上,我绝对确定它采用javascript中典型对象的形式。我还知道,另一个otherobj的构造是正确的,因为当我在forEachOf循环中为它添加一个log语句时,我得到了我希望打印到控制台的内容。@youngrrrrr,好的,我明白了。作为我个人的一点注意,到目前为止,我还没有成功地让async与一个本身具有内部回调async函数的函数配合使用。对于这些情况,我求助于使用类似async.瀑布的东西。异步函数有一个使用请求的内部异步调用。您是否尝试过构建代码,使您的异步函数没有嵌套的异步调用?这是绝对错误的。如果回调不是函数中的最后一个语句,建议使用return callback,在这种情况下,您将得到“callback get called tweep”错误。