首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何优化async.js API调用?

如何优化async.js API调用?
EN

Stack Overflow用户
提问于 2016-03-02 17:34:46
回答 1查看 399关注 0票数 1

我使用async.concat来执行API调用。我使用这个函数而不是其他async.js函数,因为:

答:在所有调用完成后,我需要一个数组的结果

B. async.concat并行地进行调用,性能是很重要的

问题是:似乎没有一种简单的方法来限制并发连接。这个程序可能需要进行100到300个不同的API调用(我无法在第一次API调用之前知道确切的#),而且我也不想让服务器崩溃。

我考虑过:

  1. 在async.doWhilst()中嵌套concat(),并执行5-10 @时间块。但这感觉有点像曾傑瑞,因为这个问题我肯定有人已经解决了。
  2. 我还可以使用一个异步函数w/ a限制选项,只需将每个结果推送到函数范围上的数组。我是否应该担心多个API调用试图同时推送到同一个数组?还是单线程意味着这不是问题?

这里还有其他简单的表演途径吗?只要它是快速的,并且我是所有对象的w/ 1数组,我对这里的大多数其他因素都没有意见。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-02 22:23:06

为了满足您的需要,node'js似乎是一个很好的工具。如果您讨论的是1000-300个API请求,那么您从node发出请求就不会有问题,因此对请求服务器(在本例中是node)进行猛烈抨击并不是一个问题。

但是,如果您对必须处理这些调用的同一服务器执行这些API调用,则可能会遇到问题,因此在本例中,如果请求的最佳数量为最佳,则应限制批调用的数量。

使用蓝鸟承诺库:

代码语言:javascript
复制
// 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个端点并不是一个问题,那么您可以这样做:

代码语言:javascript
复制
 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
 })
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35754263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档