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

标签 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方法不知何故只考虑了最后的 i值为 80。我做错了什么,我该如何解决?

最佳答案

出现此问题是因为您的 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();
    });
}

关于javascript - 如何在 node.js 中异步执行多个 REST API 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21489338/

相关文章:

node.js - 如何将各种 Mongoose 结果连接到一个 JSON 数组以显示在 DataTable 上?

javascript - Opera:检测后退、前进、刷新和关闭事件

javascript - 在 javascript 数组中查找元素哪个更快?

javascript - html页面上动态填充的选择菜单将在不使用jquery mobile的情况下显示在android webview上

javascript - 将 getItem 与主键和排序键一起使用

javascript - Electron 将我的应用程序数据存储在 'userData' 路径中

javascript - 从 TextInput 获取值并传递给祖 parent 和 child react native

javascript - 异步迭代器给出 TypeError : undefined is not a function

javascript - 如何正确创建 JQuery inArray if 语句?

javascript - 创建 excel 文件并使用 ExcelJS 写入