2017-06-18 4 views
0

私は外部URLを呼び出してレスポンスを配列に保存する必要があるnode.js expressアプリケーションを持っています。そこで、URLを格納する配列とレスポンスを格納する配列の2つの配列を作成しました。私は、応答(非同期)を待たずに一回でURLを呼び出すために各ループのために使用Javascript:複数のコールバック関数で単一の変数を使用する際に必要な提案

var urls = ['http://example.com','http://example.org','http://example.net']; 
var allResponses = []; 

handleResponseが正常な応答に

handleResponse function(response){ 
    allResponses.push(response); 
} 

Asを取得した後に呼び出されるコールバック関数です

urls.forEach(url, index, urls) { 
    callUrl(url, handleResponse); 
} 

一度にすべてのコールバックが呼び出される可能性があり、一度に複数のアクセスallResponsesにつながる可能性があります。 URLを打った後にフェッチされたすべてのレスポンスに対して、node.jsがallResponsesを入力してこの条件を処理しますか?

別のアプローチは、私はより良いアプローチである1お知らせください再帰的

function loadResponse(index) { 
    // serialize recursively 
    callUrl(urls[index++], function (response) { 
     allResponses.push(response); 
     if (index < urls.length) { 
      loadResponse(index); // recursive call 
     } 
    }); 
} 

を呼び出して電話を同期させることですか?

+0

応答の順序は関係ありませんが、配列にはすべての応答が必要です。競合状態は、古い応答またはデッドロックを上書きしてはなりません。 –

+0

それはありません。 Jsはシングルスレッドです。プッシュ* appends *ので、オーバーライドすることは不可能 –

答えて

0

あなたの最初のコードは、最速(すべて同時に)であるが、最初の要求は、第二のものよりも遅くなることがあり、したがってプッシュが正しい順序ではありません。 2つ目のコードは遅くなりますが、1つの要求が他の要求の後に開始されると、遅くなります。しかし、どちらを使うのですか?

:(...青い鳥はpromisifyでthatsのはるかに美しく注)

var urls = ['http://example.com','http://example.org','http://example.net']; 

var promises=urls.map(function(url){ 
return new Promise(function(resolve){ 
    callUrl(url,function(resp){ 
    resolve(resp); 
    }); 
}); 
}); 

:somewhen fullfilledリクエストの配列を作成

まず:まあ、オプションPromise.allを使用して3は、両方の利点を兼ね備えて

これですべてがフルフィルされるのを待つことができます:

Promise.all(promises).then(function(results){ 
console.log(results); 
}); 
+0

これは、よりクリーンなアプローチ、助けてくれたようだ。 –

0

すべての応答を配列にプッシュできますが、すべての要求が非同期であるため、それらの応答はurls = [url1、url2、url3] responses = [url1_Res、url2_Res、url3_Res]にマップされません。配列内のURLを要求したのと同じ順序でレスポンスをプッシュしたい場合は、次のコードを使用します。

var req = require('request'); 
var urls = ['http://swapi.co/api/people/1','http://swapi.co/api/people/2','http://swapi.co/api/people/3']; 
var res = []; 
var receivedRes =0; 
urls.forEach(function(val,index){ 
    console.log(`----------------Requesting url ${val}`); 
    console.log(index); 
    req(val,function(err,response,body){ 
    receivedRes++; 
    // console.log(`response of the request ${body}`) 
    res[index]=body; 
    if(receivedRes==urls.length){ 
     printRes(); 
    } 
    }) 
}); 

printRes=function(){ 
    res.forEach(function(val,index){ 
    console.log(`${index}:${val}`); 
    }) 
} 
関連する問題