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函数将永远不会返回任何内容,因为get请求只会在makeRequest函数执行后完成。您必须使用回调来访问异步函数返回的值。

于 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 回答