Node JS,链接可变数量的http请求

Node JS, chaining variable number of http requests

本文关键字:http 请求 JS 链接 Node      更新时间:2023-09-26

我使用request js库向我的API发出HTTP请求。我的单个API调用看起来像这样:

var options = {
  method: "post",
  url: 'http//example.com',
  json: true,
  headers: headers,
  body: {key: value}
}
request(options, callback);

然而,我有options数组,需要一个接一个地调用,如果其中一个失败,我需要打破整个链。

如果最后一个链完成,我需要输出结果到控制台。

我知道链接回调可以通过承诺实现,但我发现的所有示例都使用预定义的链接请求数量。

有可能吗?

在请求回调中调用自己的递归函数应该可以工作。

options = [{...}, {...}];
function doRequests(options){
    request(options.shift(), function(){
        if(error){
            return "handle error";
        }
        if(options.length > 0){
            doRequests(options);
        }
    });
}

我要做的第一件事是使用返回承诺的请求库。假设你有这样的东西,那么你只需将承诺链接在一起。

首先创建一个已解析的承诺:

var promise = new Promise.resolve();

要请求的每个新对象:

promise = promise.then(() => requestToPromise(options));

将把另一个请求链接到现有的承诺上,并且只有在前一个请求完成时才会触发一个新的请求。

如果您有一个数组,您可以拥有该数组的索引,并在前一个请求完成时让回调启动下一个请求。约:

var index = 0;
var options = [/*...array of options objects...*/];
doRequest() {
    request(options[index], function(err, result) {
        // ...handle the result/error here. If there's no error, then:
        if (++index < options.length) {
            // Kick off the next request
            doRequest();
        }
    });
}

虽然上面的可以被承诺,因为你的request方法似乎不是,它只会使事情复杂化。

你可以使用request-promise

并执行以下操作

import request = require('request-promise');
var options = [/*...array of options objects...*/];
requests = [];
options.forEach(function(option){
    requests.push(request(option));
}
Promise.all(requests).then(function(reponses){
    //all requests are done.
});