2017-01-05 4 views
-1

のNode.js apiCallは以下のように構築約束です非同期呼び出しの戻り値に基づいて意思決定を行う方法は?

while(list != []) { 
    apiCall.then(function(data){ 
    list = data; 
    }); 

} 

:API呼び出しは非同期であるため

return new Promise(function (fulfill, reject){ 
     request("url", function (error, response, body){ 
      try { 
       fulfill(body); 
      } catch (error) { 
       reject(error); 
      } 
     }, reject); 
    }); 

、何かがうまくいかないとループは決して終わりません。この問題を解決するにはどうすればよいですか?

+0

あなたに利用できるように設定されたコールバックを使用しています。 –

答えて

0

非同期の結果を待っている同期whileループを使用することはできません。非同期コールバックと、この場合は.then()ハンドラは、決して実行されません。この方法でシングルスレッドのJavascriptをプログラミングすることはできません。インタプリタはあなたのwhileループを永遠に実行し続けますが、イベントキューにイベントが蓄積されて非同期コールバックがトリガーされても、ループは決して停止しないため、これらのイベントは処理されません。 Javascriptのようなイベント駆動のシングルスレッド環境では、このように非同期動作をプログラムできません。

代わりに、同期ループを使用しないでください。典型的な解決策は、非同期呼び出しを行い、結果を評価することです。その時点でasync関数を再度実行するには、関数呼び出しを行って再度実行します。条件がそれを望むと、結果が最終的に行われたときに、発信者を正確に知ることができるように、元の約束に結果の約束を連鎖される場合は

function runIt() { 
    return a().then(function() { 
     if (needToRunAgain) { 
      return runIt(); 
     } else { 
      return someValue; 
     } 
    }); 
} 

この

は再び非同期操作を呼び出します。あなたは、このようなコードを呼び出す:

runIt(...).then(function(result) { 
    // result here 
    // you must use the async result here or call a function and pass the result 
    // to it. You cannot assign it to a higher scoped variable and expect 
    // other code that follows to be able to use it. 
}, function(err) { 
    error here 
}); 
1

あなたは同期SynJSを使用して、ループ内部のコールバックを持つ関数を実行することができます。ここで説明する作業コードは次のとおりです。

var SynJS = require('synjs'); 
var request = require('request'); 

function myFunction1(modules) { 
    var list, i=0; 
    while(i<5) { 
     modules.request("http://www.google.com", function (error, response, body){ 
      list = body; 
      console.log("got it!", i, new Date()); 
      modules.SynJS.resume(_synjsContext); //<-- indicates that callback is finished 
     }); 
     SynJS.wait(); //<-- wait for callback to finish 
     i++; 
    }; 
}; 

var modules = { 
     SynJS: SynJS, 
     request: request, 
}; 

SynJS.run(myFunction1,null,modules,function (ret) { 
    console.log('done'); 
}); 

そして、ここではその結果です:

got it! 0 Thu Jan 05 2017 18:17:20 GMT-0700 (Mountain Standard Time) 
got it! 1 Thu Jan 05 2017 18:17:20 GMT-0700 (Mountain Standard Time) 
got it! 2 Thu Jan 05 2017 18:17:21 GMT-0700 (Mountain Standard Time) 
got it! 3 Thu Jan 05 2017 18:17:21 GMT-0700 (Mountain Standard Time) 
got it! 4 Thu Jan 05 2017 18:17:21 GMT-0700 (Mountain Standard Time) 
done 
関連する問題