异步瀑布返回' Callback已被调用'

时间:2016-10-20 15:03:52

标签: javascript node.js async.js

我理解为什么会收到此错误,但我不知道如何解决此问题。这是我的第一个函数:

我所做的就是对存储在数据库中的所有网址进行get请求,然后对于每个网址响应,我通过调用=format(CDate(left("20160131",4) & "/" & mid("20160131",5,2) & "/" & right("20160131",2)),"MM/dd/yyyy")或{来查看正文并保存值信息{1}}

saveInformation(value)

我的异步瀑布看起来像这样:

saveInfoTwo(value)

function getUrlInfo(urls, callback) { urls.map(function(url) { request.get(urls, { timeout: 1500 }, function(error, response, body) { if (error) {console.log(error); } else { parseString(body, function(error, result) { if (error) {console.log(error); } else { result.Values.forEach(function(listValues) { listValues.forEach(function(value) { saveInformation(value); }); saveInfoTwo(value); }); } }); } callback(null); }); }); } 只是一种查找所有网址并将其添加到async.waterfall([ getUrls, getUrlInfo ], function(err, result) { mongoose.connection.close(); }); 数组的方法,以便getUrls可以使用它。

urls

我使用mongodb作为我的数据库。

只有一个网址时效果很好。一旦我添加了另一个网址,我就会收到此错误:

getUrlInfo

现在,在尝试调试之后,似乎所有内容都适用于第一个url,然后当第二个url完成其foreach循环时,会抛出错误。

我该如何解决这个问题?

我很确定我的function getUrls(callback) { var urls = []; urlSchema.find(function(error, data) { data.forEach(function(result) { clusters.push(result.url); }); callback(null, urls); }); } 中的回调等待所有的urls和foreach循环完成,然后继续? - 我猜不是这种情况。

任何帮助将不胜感激!

总结:如何在我添加其他网址时阻止出现错误?

1 个答案:

答案 0 :(得分:0)

您的地图调用第一个URL的函数,完成后调用callback。当第二个执行完成后,它会再次调用callback,因此您会遇到此错误。

解决方案,等待所有网址完成,然后调用回调。

正如@Bergi在评论中所说,你可以使用async map

function getUrlInfo(urls, callback) {
    async.map(urls, function(url, cb) {
      //do what you must
      cb();
    }, callback);
}