1

レポートを取得するためにリクエストをサーバーに送信するためにnode-requestを使用しています。サーバーはレポートを生成するのに時間がかかるため、レポートの状態で応答します。setInterval()関数でレポートの状態を確認しておりclearInterval()、サーバーがready応答を送信するときに使用します。しかし、このアプローチでは、 を使用した後でもclearInterval、以前のリクエストの応答が返され続け、応答ハンドラが何度も実行されます。これは多くの害を引き起こすわけではありませんが、それでも改善できると信じています。

これが私のコードです:

checkForReportReady = setInterval =>
  @request URL, options, (err, res, body) =>
    console.log err if err
    body = JSON.parse body

    if body['status'] is 'ready'
      clearInterval checkForReportReady
      @processReport body
  , 1000

必要なもの:リクエストを作成し、応答を待ち、ステータスを確認します。ステータスがそうでない場合は、readyタイムアウト後に別のリクエストを作成し、応答のステータスコードがready. ステータスが準備完了の場合 - ループを終了 (または間隔をクリア) して実行します@processReport

約束のリクエストをして、 に入れようとしましsetIntervalたが、結果は同じでした。

PS 私はサーバーを制御していないので、サーバーがレポートに応答したり処理したりする方法を変更することはできません。

4

2 に答える 2

1

間隔コールバックにリクエストを入れないことをお勧めします。これは、a) 失敗した場合、b) 間隔よりも長くかかる場合に醜くなる可能性があります。

代わりにsetTimeout、成功ハンドラーに a を入れて、応答を受信した後 (およびその場合にのみ) 再試行します。
これは、プロミスを使用するとかなり簡単です。

request = Promise.promisifyAll require 'request'
getReport = () =>
  request URL, options
  .spread (res, body) =>
    body = JSON.parse body
    if body.status is 'ready'
      body
    else
      Promise.delay 1000
      .then getReport # try again

getReport().then(@processReport, (err) -> console.log(err))
于 2015-09-02T12:23:40.057 に答える