2016-05-04 3 views
0

私は40回ウェブサイトをリクエストしたいと思います。Javascript.Run Multiは同期的に約束します

これは10回のリクエストと同じように同期しています。

これが1つの要求のための私のコードです - 40回:私は約束の配列を作ることができますが、私は異なるようにqの値を変更するにはどのようにそれを把握することはできません

'use strict'; 

var request = require('request'); 
var co = require('co'); 


function callUrl(url) { 
    return new Promise((resolve, reject) => { 
     request.get(url, (e, r, b) => { 
      if (e) reject(e) 
      else 
       resolve(`Response from ${url}`); 
     }); 
    }) 
} 


co(function*() { 
     for (var i = 1; i < 41; i++) { 
      let rs = yield callUrl('https://www.google.com/?q=' + i); 
      // let rs = yield makeUrls(10,i); 
      console.log(rs); 
     } 
    }); 

+0

はあなたが合格するか終了する前のもののためにwaifますので、約束のチェーンを構築することであるO/Wうまくいくかもしれませんそれぞれの約束の結果は次のものになるか、または直接関係なく同期して発射されますか? –

+0

私はチェーンでそれらを起動したい、私は各URLをループしたくない。 「10000」リクエストをしなければならないとします。私は一度に複数の約束をしたい。私はDDOSサーバーを持っている可能性があるので、一度にそれらをすべて望んでいません。 –

答えて

1

これらを同期して実行したくない場合(同期させたい場合)は、異なるものです。

約束の配列をPromise#allと一緒に使用します。約束を作成すると、アクションはすでに実行中です。yieldだけが物事を同期させます。

あなたはそうのように一度に10個の要求を行うことができます。それに加えて、あなたのコードはまだ非常に効率的ではないことを

co(function*() { 
    for (var i = 1; i < 41;) { 
     var promises = []; 
     for(var lim = i + 10; i < Math.max(lim, 41); i++) { 
      promises.push(callUrl('https://www.google.com/?q=' + i)); 
     } 
     let rs = yield Promise.all(promises); // wait for everything 
     console.log(rs); // an array of 10 results 
}); 

注 - 9 10のうちの要求が本当に高速で、1がかかる場合何が起こるかを一分? 1つの発信リクエストしかありません。より効率的なPromise.mapメソッドと並行性パラメータを持つbluebirdのようなライブラリを使用できます。

+0

それは動作します、ありがとう。 しかし、約束事を配列にプッシュする 'for'ループについて私に説明してください。 なぜ 'j ++' –

+0

が正しいのか分かりません.2番目のカウンタは実際には必要ありません(私はcallUrlでjを使っていたので、これを行いました)。 –

0

これは使用して発電機

const urls = [/*array of urls*/]; 
const initialPromise = request[urls[0]]; 
let promise = initialPromise; 
for(let i= 1; i<40;i++){ 
    let thenFunction = response => { 
    //do something with the response 
    return request(urls[i]) 
    } 
    promise = promise.then(thenFunction) 
} 

この背後にある考え方は、次のものが

+0

OPのコードはすでにコルーチンでこれを行っています。 –

+0

これは、彼が興味を持っていた場合のジェネレータレームアプローチでした –

関連する問題