0

失敗したリクエストの後にリクエストを再試行しようとしています。ただし、リクエストを遅らせたいと思います。私setTimeoutの関数は返されたjsonをテストし(そして再帰的です)、setTimeoutはコールバックの戻り値を返さないため、うまくいきませんでした。

function makeRequest(req, nextjson, attempts){
  // I'm using a different method here
  get({url: "http://xyz.com", json: nextjson},
    function(err, json2){
      if(err===200){
        return json2
      } else {
        // json2 might be bad, so pass through nextjson
        if(attempts < 5){
          return makeRequest(req, nextjson, attempts+1)
        } else {
          // pass back the bad json if we've exhausted tries
          return json2
        }
      }
   })
}

再帰呼び出しの実行を遅らせたい。また、私はこのコードに少し当惑しています。あまりにも命令的です。きれいにする方法があれば、それもよろしくお願いします

4

2 に答える 2

2

関数から値を返すには、setTimout関数を書き直してコールバックを利用する必要があります。

function makeRequest(req, nextjson, attempts, callback) {
    // I'm using a different method here
    get({
        url: "http://xyz.com",
        json: nextjson
    }, function (err, json2) {
        if (err === 200 || attempts === 5) {
            callback(json2);
        } else {
            setTimeout(function () {
                makeRequest(req, nextjson, attempts + 1, callback);
            }, 1000);
        }
    });
}

そして、次のように呼び出します。

makeRequest(requestStuff, jsonStuff, 0, function(result){
    // do stuff with result
});

追加する必要がありますが、get関数は非同期関数です (コールバックが渡されることで明らかです)。このままでは、関数が実行された後にのみ要求が完了するため、関数makeRequestは何も返しません。非同期関数によって返される値にアクセスするには、コールバックを使用する必要があります。getmakeRequest

于 2013-11-11T17:12:22.917 に答える
1

通話を調整するためにレートリミッターを試すことをお勧めします。制限に違反した場合、先に進むためのトークンを取得できません。

https://github.com/jhurliman/node-rate-limiter

例:

var RateLimiter = require('limiter').RateLimiter;
// Allow 150 requests per hour. Also understands
// 'second', 'minute', 'day', or a number of milliseconds
var limiter = new RateLimiter(150, 'hour');

// Throttle requests
limiter.removeTokens(1, function(err, remainingRequests) {
  // err will only be set if we request more than the maximum number of
  // requests we set in the constructor

  // remainingRequests tells us how many additional requests could be sent
  // right this moment

  callMyRequestSendingFunction(...);
});
于 2013-11-11T17:06:16.237 に答える