javascript - 使用 Bluebird.mapSeries 按顺序处理一组 API 调用

标签 javascript promise bluebird

我一直在尝试的是按顺序处理 API 调用,这些调用被推送到一个数组中。

function resolveApi(callback) {
  return new Promise(function(resolve, reject) { resolve(callback) });
}

function callApi(){

    var promises = [];
    promises.push(resolveApi(Restangular.one("api/blahblah",{/*input data*/})));
    promises.push(resolveApi(Restangular.one("api/another/api",{/*input data*/})));
    //there are other similar API calls.
    //Restangular is supposed to return an API call

    promises = Bluebird.mapSeries(promises, function(item, index) {
        return item;     
    });

    promises.then(function(){/* the end */});
}

目标是处理 promises 数组中的每个 API 调用,但上面的代码并没有这样做。 (即几乎同时调用 API 调用,而每个 API 调用都应该等到前一个调用完成。)

你看到我做错了什么吗?

任何建议将不胜感激。

最佳答案

好的,如果 Restangular.one() 返回一个 promise(您的评论现在表明了这一点)并且您想按顺序处理这些 api 调用(一个接一个),那么您只需要组织Bluebird 的 .mapSeries() 的参数正确。它需要一个数据数组和一个函数(对该数据进行操作并返回一个 promise )。

那么,让我们这样组织你的东西:

const data = [
    {endPoint: "http://somedomain.com/api/blahblah", args: [1,2]},
    {endPoint: "http://somedomain.com/api/another/api", args: ["a", "b"]},
    {endPoint: "http://somedomain.com/api/yetanother", args: ["abc"]},
];

Promise.mapSeries(data, function(dataObj) {
    return Restangular.one(dataObj.endPoint, ...dataObj.args);
}).then(results => {
    // array of results here
    console.log(results);
}).catch(err => {
    // error occurred here
    console.log(err);
});

既然你说 Restangular.one() 已经返回了一个 promise ,我看不出有任何理由需要将它包装在你的 resolveApi() 函数中.这不是必需的,我们当然不需要将 promise 变成简单的回调来使用 .mapSeries()


您的实现中缺少很多东西,但最主要的是您立即调用所有异步操作,然后尝试管理 promise 。那不会对您的操作进行排序。并行运行它们。此外,如果您给 .mapSeries() 一个 promise 数组,它就无法对操作进行排序,因为它们都已经开始了。为了让它管理异步操作何时开始以便它可以对它们进行排序,您必须向它传递一个数据数组和一个要调用的函数,该函数传递了该数据的一项并将返回一个 promise 。然后,它可以一次一个地调用它们,您的操作将一次一个地开始。

关于javascript - 使用 Bluebird.mapSeries 按顺序处理一组 API 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49064609/

相关文章:

node.js - Bluebird Promise 和 Sequelize 模拟事务原子性

javascript - 递归 promise 链末尾的链式操作

javascript - 如何从数组中删除对象并保存以供以后使用?

javascript - 在旧的 div 之上设置一个新创建的 div

javascript - 如何获取相似名称的元素?查询

javascript - .then 的 AngularJS 条件案例基于仅在第一个 .then 之前已知的 var 值

javascript - 如何使用 JavaScript 等待元素存在?

node.js - 什么是everyauth promise ?

使用 Webpack 编译的 Javascript 失败并注入(inject)了奇怪的代码

javascript - Bluebird<void> 在 return 语句中不可分配给 Bluebird<Process Instance>