2017-09-14 2 views
0

配列がifの条件を通過するasync.each()に配列を渡していますが、配列がelseステートメントに入力されているときに条件が満たされたときに配列に項目を追加すると、実行はshippo応答を待機しません。次の行に移動し、応答をサーバーに送信します。コールバック関数からの応答が得られるまで、実行フローを停止するにはどうすればよいですか?

私たちは、数秒後にshippoからの応答を取得していることに気づいたので、私はelseブロックの完了後setTimeout()機能を置き、それでも私のコンソールにメッセージ'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'を使用しています(この執筆時点では、私はより正常な約束の連鎖にそれを非難するためにopen PR on GitHubを持っています)。

'when'を使用した結果、エラーをキャッチするには、.then()の2つの関数を成功パスとエラー処理の2つの関数に渡すことを意味します。それはこのような種類の仕事になります。

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機能であなたの呼び出しが成功したかではないことを保証するものではありません。

then()に渡された各機能の内のcallback()ファンクションを呼び出す必要があります。結果を受け取ったら、async.each()という関数のインスタンスを解決することができます。これらの関数の内部でcallback()を処理することにより、成功とエラーを正しく処理できます。

関連する問題