JSで非同期の問題を処理するときに、すべての無名関数を一時的に移動して名前を付け、それらがいつ渡され、いつ呼び出されるかを明示的に示すと便利なことがよくあります。
function makediffbotAPIcall(item, array) {
var url_to_send_diffbot = "string of url here"
var receiveResponse = function (error, response, body) {
if (!error && response.statusCode == 200) {
var article_object = JSON.parse(body);
var object = {"Title": article_object.title, "Url":article_object.url};
}
}
request(url_to_send_diffbot, receiveResponse);
return object;
}
したがって、ここにはいくつかの問題があります。まず、リクエストが同期的であったとしても(古いシングルスレッドのJavaScriptの場合、これはひどいことです)、var object
内部receiveResponse
で使用するため、これは機能しません。そのため、変数はその関数の外部では使用できません。
この特定の問題の場合、最も簡単な解決策は、console.log(object)
insideを呼び出すことreceiveResponse
です。より複雑なことを行うコードを実際に単純化したと仮定すると、さまざまなパターンを利用できます。各リクエストが前のリクエストの後に順番に発生することが重要ですか、それとも並行して実行し、別々にログに記録することは問題ありませんか(おそらく順序が狂っています)?基本的に、コールバックパラメータを追加してその関数をinsideでmakediffbotAPIcall
呼び出すか、Promiseオブジェクトを返す必要があります。これは、それらを提供するフレームワーク/ライブラリをすでに使用していない限り、おそらくやり過ぎです。並列および/または順次操作のサポート。object
responseReceived
質問を読み直しましたが、動作をブロックしたいようです。再帰を使用した純粋なJSソリューション(libは不要= P)を次に示します。
var i=0;
var callNext = function(object){
if(i<out.items.length) {
makediffbotAPIcall(out.items[i], callNext);
}
console.log(object);
i++;
}
callNect("nothing to log for first obj");
function makediffbotAPIcall(item, array, callback) {
var url_to_send_diffbot = "string of url here"
var receiveResponse = function (error, response, body) {
if (!error && response.statusCode == 200) {
var article_object = JSON.parse(body);
var object = {"Title": article_object.title, "Url":article_object.url};
callback(object);
}
}
request(url_to_send_diffbot, receiveResponse);
}
これは多少の整理で行うことができます(再帰の基本ケースは扱いにくいです)が、必ずしもライブラリが必要なわけではありません;)