如何在node.js中异步执行多个REST API请求?

时间:2014-01-31 20:21:20

标签: javascript node.js async.js

我想要做的是做多个远程REST API请求,我希望每个请求一个接一个地按顺序完成。我读到async.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方法只是考虑到80的最终i值。我做错了什么,我该如何解决这个问题?

1 个答案:

答案 0 :(得分: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();
    });
}