Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.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 等待所有回调完成,然后返回对象_Javascript_Node.js - Fatal编程技术网

Javascript 等待所有回调完成,然后返回对象

Javascript 等待所有回调完成,然后返回对象,javascript,node.js,Javascript,Node.js,我有一个功能,需要刮一个网站,并返回一个地址列表。在scrape的回调中,对于返回的每个地址,我需要执行另一个scrape操作,然后处理数据,然后我要返回整个已处理的集合。如果有必要,我不介意阻拦。最终,我必须得到一个包含整个集合的JSON对象。这可能吗?我该怎么做 function doSomething(req, res){ var collection = []; scrape1(params, function(error, addresses){ i

我有一个功能,需要刮一个网站,并返回一个地址列表。在scrape的回调中,对于返回的每个地址,我需要执行另一个scrape操作,然后处理数据,然后我要返回整个已处理的集合。如果有必要,我不介意阻拦。最终,我必须得到一个包含整个集合的JSON对象。这可能吗?我该怎么做

function doSomething(req, res){

    var collection = [];

    scrape1(params, function(error, addresses){
        if(!error){
            for(var i in addresses){   
                //do some stuff with addresses here

                scrape2(otherparams, function(error, address, data){
                    //manipulate the data here

                    collection.push({ 'address' : address, 'data' : data})  
                });
            }
            //this just returns an empty set obviously
            res.json(collection);

            //how can I return the entire collection from this function?
        }
    }); 
}

以下是使用该模块的一个解决方案:


为什么不直接制作
res.json(集合)进入“成功时”的回调中执行此操作?…->@你能详细说明一下吗?我该怎么做呢?看看jquery提供的
then()
。这是一个很棒的控制器机制。基本上类似于
res.json(collection)。。。代码转换为当ajax调用成功时执行此操作。我们在全局函数中的ajax调用中经常使用then(),实际的最终代码将取决于res的实现方式。你有那个函数调用的代码吗?它是内置的jquery函数调用吗?我们将从那里决定如何实现
then()
,或者是否需要使用其他工具
function doSomething(req, res){

  var collection = [];

  scrape1(params, function(error, addresses){
    if (error)
      return console.error(err); // handle error better

    async.each(addresses, function(address, callback) {
      scrape2(otherparams, function(err, address, data){
        // manipulate the data here
        if (err)
          return callback(err);
        collection.push({ 'address' : address, 'data' : data});
        callback();
      });
    }, function(err) {
      if (err)
        return console.error(err);  // handle error better
      res.json(collection);
    });
  }); 
}