【问题标题】:Recommended way to issue multiple parallel REST calls and wait for all results in node.js发出多个并行 REST 调用并等待 node.js 中的所有结果的推荐方法
【发布时间】:2020-02-22 19:58:18
【问题描述】:

我想调用几个 REST API 来获取我使用的数据。我希望所有 REST 调用都完成,然后进行一些计算。下面的代码有效,但我不太喜欢它。尤其是当一个站点返回错误时,要查看它的来源并不容易。我宁愿单独处理每个呼叫,然后最后“等待”所有呼叫完成。这样,如果某个 REST 调用不起作用,我也可以进行部分计算

const rp = require('request-promise');


var site1 = {
    uri: 'https://www.site1.com/api/v1/somedata.json',
    json: true
};


var site2 = {
    uri: 'https://www.site2.com/api/v1/somedata.json',
    json: true
};

var site3 = {
    uri: 'https://www.site3.com/api/v1/somedata.json',
    json: true
};


var promises = [];
promises.push(rp(site1));
promises.push(rp(site2));
promises.push(rp(site3));


Promise.all(promises).then(data => {
    console.log(data);
    // fetch all data from data variable and do calulation 
}, err => {
    console.log('error')
});

【问题讨论】:

  • Promise.all 要么全有,要么全无。您需要单独处理它们。
  • 你可以使用Promise.allSettled(),它会在所有给定的promise都被解决或拒绝后解决。

标签: javascript node.js promise request


【解决方案1】:

如果您想在结果输入时单独处理每一项,您可以为每一项添加.then() 和/或.catch() 处理程序:

var promises = [];
promises.push(rp(site1).then(result => {
    // do any partial processing
    return result;
}).catch(err => {
    // decide what to do if error
    throw err;
}));
promises.push(rp(site2).then(result => {
    // do any partial processing
    return result;
}).catch(err => {
    // decide what to do if error
    throw err;
}));
promises.push(rp(site3).then(result => {
    // do any partial processing
    return result;
}).catch(err => {
    // decide what to do if error
    throw err;
}));

Promise.all(promises).then(data => {
    console.log(data);
    // fetch all data from data variable and do calulation 
}, err => {
    console.log('error')
});

当然,如果每个请求的处理相同,则将额外的功能封装在调用rp() 的函数中,然后进行处理,然后您可以使用该函数代替rp()。所以,这真的取决于你想要做什么中间处理。


如果处理相同,您可以创建自己的包装函数。例如,假设您只想继续处理,即使出现错误,您也可以这样做:

function rpExtra(args) {
    return rp(args).catch(err => {
        console.log(err);
        return null;   // sentinel resolved value to keep processing going for Promise.all()
    });
}

var promises = [];
promises.push(rpExtra(site1));
promises.push(rpExtra(site2));
promises.push(rpExtra(site3));


Promise.all(promises).then(data => {
    console.log(data);
    // fetch all data from data variable and do calculation
    // skip any `null` values (those had errors) 
}, err => {
    console.log('error')
});

这里错误处理的具体操作细节是非常具体的,所以我已经给了你结构,你必须填写你想要做什么。 .catch() 处理程序可以重新抛出(以保持承诺被拒绝并让Promise.all() 中止),也可以返回一个值(将承诺更改为已解决并保持Promise.all() 处理继续进行)。

【讨论】:

  • @jaaph - 这回答了你的问题吗?如果是这样,您可以通过单击答案左侧的复选标记在此处向社区表明这一点。这也将为您在 stackoverflow 上赢得一些声誉点,以遵循正确的程序。如果这没有回答您的问题,请评论您仍然对问题的哪一部分感到困惑。
猜你喜欢
  • 1970-01-01
  • 2019-10-21
  • 2019-05-09
  • 2021-03-17
  • 2020-11-03
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
  • 2019-04-08
相关资源
最近更新 更多