2016-11-16 5 views
0

私はAPIにHTTPリクエストを行うためにrequest jsライブラリを使用しています。私の単一のAPI呼び出しは次のようになります。ノードJS、可変数のhttpリクエストのチェーン

var options = { 
    method: "post", 
    url: 'http//example.com', 
    json: true, 
    headers: headers, 
    body: {key: value} 
} 
request(options, callback); 

は、しかし、私は別の後1と呼ばれるために必要とされているoptionsの配列を、持っていると私はそれらのいずれかに障害が発生した場合はチェーン全体を分割する必要があります。

最後のチェーンが終了したら、結果をコンソールに出力する必要があります。

私は連鎖コールバックが約束によって実現できると知っていますが、私が見つけたすべての例では、定義済みの連鎖要求が使用されています。

可能ですか?

+0

request-promise

を使用して行うことができますが、定義された順序に従わなければなりませんか?なぜpromise.allでないならば? –

+0

なぜ各約束を順番に実行する必要がありますか? Promise.allを使用して同じ時間に実行することができます –

答えて

1

配列を持っている場合、その配列にインデックスを付けることができ、前の配列が終了したときにコールバックを次のリクエストから開始することができます。大雑把:

var index = 0; 
var options = [/*...array of options objects...*/]; 
doRequest() { 
    request(options[index], function(err, result) { 
     // ...handle the result/error here. If there's no error, then: 
     if (++index < options.length) { 
      // Kick off the next request 
      doRequest(); 
     } 
    }); 
} 

あなたrequest方法はではないと思わので、上記、約束-ifiedことができますが、それだけで物事を複雑にします。

+0

ありがとうございます。それはより簡単で分かりやすくなります。私は今、とても愚かな気がする。 –

+0

@ Mr.D:私たちは皆、初めてのことを学ばなければならなかった、自分を打ち負かさないで! –

2

リクエストコールバックで自分自身を呼び出す再帰関数が動作するはずです。

options = [{...}, {...}]; 

function doRequests(options){ 

    request(options.shift(), function(){ 

     if(error){ 
      return "handle error"; 
     } 

     if(options.length > 0){ 
      doRequests(options); 
     } 

    }); 

} 
2

私が最初にすることは、約束を返したリクエストライブラリを使用することです。あなたはそのようなことがあると仮定すると、約束を一緒に結びつけるだけです。

まず解決の約束を作成:それぞれの新しいオブジェクトの

var promise = new Promise.resolve(); 

ザ・あなたがリクエストしたい:

promise = promise.then(() => requestToPromise(options)); 

意志チェーン別の要求を既存の約束にのみ、新しい要求をオフに起動しますが前のものが完了したとき。

0

あなたが代わりに

import request = require('request-promise'); 

var options = [/*...array of options objects...*/]; 
requests = []; 
options.forEach(function(option){ 
    requests.push(request(option)); 
} 
Promise.all(requests).then(function(reponses){ 
    //all requests are done. 
}); 
関連する問題