2017-09-14 45 views
0

我將一個數組傳遞給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

帶有回調的想法是,您在完成調用後不做任何事情,然後在調用完成時執行回調函數。爲了停止執行,您只需在調用後沒有任何代碼。 – Archer

回答

0

我會強烈建議審查關於AsyncFunction()async庫中的文檔。看起來您應該致電回撥,無論您是否成功完成了您的請求發生了錯誤。由於Shippo庫正在使用'when'來處理類似promise的鏈接(在撰寫本文時,我有一個開放的PR on GitHub以反對更正常的承諾鏈接)。

由於使用了'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')最後被打印出來,是因爲它不會執行這條線,直到最初的承諾已得到解決,用於從七寶的跟蹤狀態。

此外,通過調用一個setTimeout()功能callback(),你只拖延每次迭代從3秒解決,但不一定保證你在shippo函數調用成功與否。

您應該調用callback()函數內部的傳遞給then()的每個函數。所以,一旦你收到你的結果,你可以解決async.each()調用的函數實例。通過處理這些函數中的callback(),您可以正確處理成功和錯誤。

相關問題