我将一个数组传递给async.each()
,执行将通过if
条件,当条件满足时,它会在进入else
时将项添加到数组中}语句,执行不会等待shippo响应。它移动到下一行并将响应发送到服务器。
我注意到几秒钟后我们收到shippo
的响应,因此我在setTimeout()
块完成后放置了else
函数,但即使在我的控制台中也是如此'c'
将打印到最后。我对回调非常困惑,他们将如何运作。在我们从shippo
获得响应之前,还有其他方法可以暂停执行流程。
var async = require('async');
import each from 'async/each';
async.each(trackingnumbers, function (value, callback) {
value['TrackingNo'] = parseInt(value['TrackingNo']);
value['Provider'] = value['Provider'].toLowerCase();
if (value['Provider'] == "domestic") {
items.push({ 'TrackingNo': value['TrackingNo'], 'Provider': value['Provider'], 'Status': 'Completed' });
console.log('a');
}
else {
console.log('b');
shippo.track.get_status(value['Provider'], value['TrackingNo']).then(function (status) {
console.log('c');
items.push({ 'TrackingNo': value['TrackingNo'], 'Provider': value['Provider'], 'Status': status.tracking_status });
}, functionconsole.log('d'); (err) {
console.log("There was an error retrieving tracking information: %s",+ err);
callback('There was an error retrieving tracking information:');
//
});
console.log('d');
e }
console.log('e');
setTimeout(function(){
callback();
},3000);
}, function (err) {
if (err) {
console.log('error occured ' + '|' + err);
}
else {
console.log(items);
res.setHeader("Access-Control-Allow-Origin", "*");
res.send(items).status('200');
}
});
Here is my output along with the shippo response after we placed an timeout function
答案 0 :(得分:0)
我强烈建议您查看有关async
的AsyncFunction()
图书馆的文档。看起来您应该调用回调是否已成功完成请求或发生错误。
由于Shippo库正在使用'when'
来处理类似承诺的链接(在撰写本文时,我有一个开放的PR on GitHub将其弃用为更正常的promise链接。)
由于使用'when'
,这意味着要捕获错误,您将传递.then()
两个函数,一个用于成功路径,另一个用于处理错误。它有点像这样:
shippo.track.get_status('usps', '1122334455667788')
.then(function (results){
// do stuff with your successful function call
}, function (error) {
// do stuff with the error you just received
});
console.log('c')
最后打印的原因是因为它不会执行该行,直到原始承诺已经解决从Shippo检索跟踪状态。
此外,通过在callback()
功能中调用setTimeout()
,您只能将每次迭代延迟解决3秒,但并不一定能保证您的呼叫能够在shippo
功能是否成功。
您应该调用传递到callback()
的每个函数的<{1}}函数。因此,一旦收到结果,就可以解析then()
调用的函数实例。通过处理这些函数内部的async.each()
,您可以正确处理成功和错误。