2017-05-12 12 views
0

こんにちは、次のhttp要求がサーバーに送信される前に50msを許可しようとしています。要求が行われました。ループされたHTTP要求で遅延を許可する方法も、要求が行われたときにPromise.allを使用して検出します。

私は何をしたいかを例示するために例を挙げました。そこで、以下

は私の例である急行API

app.get('/morans/test', (req, res) => { 
    console.log(`start test request`); 
    let targetUrl = `http://-domain-/solr/genea_expression/smplGeoclust?q=text:"GO:0003674"&stats.facet=geohash_3&rows=10320`; 
    let i = 0; 
    let promises = []; 

    console.log(`making request ${i}`); 


    for (let i = 0; i < 200; i++) { 
     setTimeout(
      () => { 
       let testReq = new Promise((resolve, reject) => { 
        http.get(targetUrl, (result) => { 
         result.on('data', (chunk) => { 
          console.log(`working ${i}`); 
         }).on('end',() => { 
          console.log(`ending ${i}`); 
         }).on('error', (err) => { 
          console.log(`this is error message ${err}`); 
         }) 
        }) 
       }); 

       promises.push(testReq); 
      }, 50 * i 
     ) 
    } 
    Promise.all(promises).then(() => { 
     console.log(`done`); 
    }); 
}); 

遅延が正常に動作します。しかし、Promise.all(promises)...は時期尚早なトリガー(最初の要求が行われるとすぐにconsole.log('done')トリガー)を取得しています。タイムアウトがなくてもうまく動作するので、setTimeoutは、約束を約束してpromises配列にプッシュするのに十分な時間がないと考えています。 HTTP要求が50msごとに行われるようにコードを記述することはできますが、すべての要求が正常に返された時点も知っていますか?

答えて

2

promisesアレイが空である場合は、Promise.allに電話をかけています。タイムアウトがまだ期限切れになっていないからです。そうしないと約束は意志、

また
for (let i = 0; i < 200; i++) { 
    setTimeout(
     () => { 
      // ...etc ... etc 
      promises.push(testReq); 
      if (promises.length == 200) { // <---- add this block 
       Promise.all(promises).then(() => { 
        console.log(`done`); 
       }); 
      } 
     }, 50 * i 
    ) 
} 

あなたnew Promiseコールバック内resolve()を呼び出すことを確認してください。

は、あなたは正しいpush後、あなたのタイムアウトコールバックの内側にそのPromise.allコールを移動し、その配列の長さをチェックすることができます保留中の滞在:

    .on('end',() => { 
         console.log(`ending ${i}`); 
         resolve(); 
        }) 

が実際に応答データを取得する方法を参照してくださいdocumentation on http.getを見るを呼び出すためにそれは理にかなってそのデータを引数として

+0

ありがとうございました!魅力のように働く。また、 'resolve()'の素晴らしいキャッチに感謝します。私は実際のAPI上にそれを持っていましたが、テストAPIにそれを入れるのを忘れました。助けをありがとう! – forJ

関連する問題