2014-01-31 3 views
1

Я хочу сделать несколько удаленных запросов REST API, где я хочу, чтобы каждый запрос выполнялся последовательно, один за другим. Я читал, что async.js - это способ сделать это.Как асинхронно выполнять несколько запросов API REST в node.js?

Как я не знаю, сколько раз я должен выполнить запрос, я использую async.whilst(). Идея состоит в том, что я перестану запрашивать, как только API вернет нулевые сообщения. Вот мой код до сих пор (для целей тестирования я ограничил цикл только 5 раз).

var request = require('request'); 
var async = require('async'); 

var APIKEY = 'api-key-here'; 

var i = 0; 
var continueWhilst = true; 
async.whilst(
    function test() { return continueWhilst; }, 
    doThisEveryTime, 
    function (err) { 
    // Done 
    } 
); 

function doThisEveryTime(next) { 

    reqURL = 'http://api.tumblr.com/v2/blog/testsite.com/posts/text?api_key=' + APIKEY + '&offset=' + i*20; 

    request(
    reqURL, 
    function (err, resp, body) { 
     if(!err && resp.statusCode == 200) { 
     var resultAsJSON = JSON.parse(body);  
     console.log(reqURL);   
     console.log("Request #" + i + " done"); 
    } 
    }); 

    i++; 
    if (i===5) { 
    continueWhilst = false; 
    } 
    console.log("Iterating, i= " + i); 
    next(); 
} 

Тест выход таков:

Iterating, i= 1 
Iterating, i= 2 
Iterating, i= 3 
Iterating, i= 4 
Iterating, i= 5 
http://api.tumblr.com/v2/blog/testsite.com/posts/text?api_key=api-key-here&offset=80 
Request #5 done 
http://api.tumblr.com/v2/blog/testsite.com/posts/text?api_key=api-key-here&offset=80 
Request #5 done 
http://api.tumblr.com/v2/blog/testsite.com/posts/text?api_key=api-key-here&offset=80 
Request #5 done 
http://api.tumblr.com/v2/blog/testsite.com/posts/text?api_key=api-key-here&offset=80 
Request #5 done 
http://api.tumblr.com/v2/blog/testsite.com/posts/text?api_key=api-key-here&offset=80 
Request #5 done 

метод request каким-то образом только с учетом окончательного i значение 80. Что я сделал не так, и как это исправить?

ответ

2

Проблема возникает из-за того, что переменная reqURL не имеет var и не относится к области doThisEveryTime. Вы также делаете все свои запросы сразу, так как вы не дожидаетесь завершения запроса до звонка next. Эти две вещи приводят к тому, что запрос выполняется пять раз одновременно с тем же URL-адресом. Попробуйте следующее:

function doThisEveryTime(next) { 
    var reqURL = 'http://api.tumblr.com/v2/blog/testsite.com/posts/text?api_key=' + APIKEY + '&offset=' + i*20; 

    request(reqURL, function (err, resp, body) { 
     if (!err && resp.statusCode === 200) { 
      var resultAsJSON = JSON.parse(body);  
      console.log(reqURL);   
      console.log("Request #" + i + " done"); 
     } 

     i += 1; 

     if (i === 5) { 
      continueWhilst = false; 
     } 

     console.log("Iterating, i= " + i); 

     // This is in the callback for request now. 
     next(); 
    }); 
} 
Смежные вопросы