2013-11-11 3 views
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 
     } 
     } 
    }) 
} 

Я хочу отложить выполнение рекурсивного вызова. Кроме того, я немного смущен этим кодом. Путь слишком необходим. Если у вас есть способы его очистки, я бы тоже признал, что тоже

ответ

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 уже был выполнен. Вы должны использовать обратные вызовы для доступа к значениям, возвращаемым асинхронной функцией.

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(...); 
}); 
Смежные вопросы