我使用async.concat来执行API调用。我使用这个函数而不是其他async.js函数,因为:
答:在所有调用完成后,我需要一个数组的结果
B. async.concat并行地进行调用,性能是很重要的
问题是:似乎没有一种简单的方法来限制并发连接。这个程序可能需要进行100到300个不同的API调用(我无法在第一次API调用之前知道确切的#),而且我也不想让服务器崩溃。
我考虑过:
这里还有其他简单的表演途径吗?只要它是快速的,并且我是所有对象的w/ 1数组,我对这里的大多数其他因素都没有意见。
发布于 2016-03-02 22:23:06
为了满足您的需要,node'js似乎是一个很好的工具。如果您讨论的是1000-300个API请求,那么您从node发出请求就不会有问题,因此对请求服务器(在本例中是node)进行猛烈抨击并不是一个问题。
但是,如果您对必须处理这些调用的同一服务器执行这些API调用,则可能会遇到问题,因此在本例中,如果请求的最佳数量为最佳,则应限制批调用的数量。
使用蓝鸟承诺库:
// mock data
// supposing that this is the array of apis to call
var requestsToComplete = [c1, c2, c3, ..., c300];
var Promise = require('bluebird');
var results = [];
var fakeCounter = 0;
// fake api call... for demonstration purposes
function processApiCall(apiData) {
// simulate api call...
var promise = new Promise(function(resolve, reject) {
setTimeout(function() { resolve(fakeCounter++) });
});
return promise;
}
function processBatch(reqs, batchSize, skip) {
var batchRequests = [];
for (var i = skip; i < Math.min(i+batchSize, reqs.length); i++) {
var requestPromise = processApiCall(reqs[i]);
batchRequests.push(requestPromise);
}
// process all
return Promise.all(batchRequests);
}
function makeApiCalls() {
var batchCount = 0;
var batchSize = 10;
var promise = Promise.resolve();
while (batchCount < requestsToComplete.length) {
batchCount += batchSize;
promise = promise.then(function() {
return processBatch(requestsToComplete, batchSize, batchCount);
}).then(function(batchResponse) {
results = results.concat(batchResponse);
});
}
promise.then(function() {
// all api calls finished
// results now contain all the responses in order of calling, i.e.
results = [c1Response, c2Response, ..., c300Response];
// well, in our case results will be an array of fake results...
results = [0, 1, 2, ..., 300];
});
}请注意,我的上述代码没有经过测试,只是我如何处理这种情况的一个例子。
但是当然,如果同时调用所有300个端点并不是一个问题,那么您可以这样做:
var promises = [];
for (... iterate through api endpoints) {
promises.push(processEndpoint(endpoints[i]));
}
Promise.all(promises).then(function (results) {
// results will be an array with each response, in order of calling
})https://stackoverflow.com/questions/35754263
复制相似问题