js之Promise.all()、Promise.race()、Promise.finally()

355 阅读1分钟

本文方法在浏览器端我们可以使用axios 来使用

本文使用nodejs(express)测试。

Tips: nodejs版本在8.9.0以前都不支持Promise的finally方法,后来本人升级到12.13.1做的测试,推荐使用nvm进行node版本管理,可以支持本机安装多个版本,随意切换。

正文开始:

搭建express基础框架,此处省略

1.使用node-rest-client做Restful 请求

const Client = require('node-rest-client').Client;const client = new Client();module.exports = {    myapi: function (url) {        return new Promise((resolve, reject) => {            // 请求后端此处可以对参数进行二次处理            client.get(url, function (data) {                resolve(data);                // reject('asdasdasdas');            }).on('error', function (err) {                reject('Something Wrong on the javaService ::: ' + err.request.href)            });        })    }}


2.route层调用上面的方法

router.get('/home', async function (req, res, next) {  const api1 = proxy.myapi('http://rap2api.taobao.org/app/mock/87055/dict/voltageList')  const api2 = proxy.myapi('http://rap2api.taobao.org/app/mock/87055/dict/bayUnitList')  const p = Promise.all([api1, api2])    .then(res => {      console.log('then')    })    .catch(err => {      console.log('catch')    }).finally((finData) => {      console.log('finally')    })});

返回都正常结果为:
then 
finally

返回有异常结果为:
catch
finally

如果把上面的Promise.all改为Promise.race

则返回有一个正常结果就会

then

finally

返回都错误

catch 

finally


总结

Promise.all() — 全部成功才会then

Promise.race() — 一个成功就会then

Promise.finally() — 始终都会执行


但是要注意,then 、catch 和finally 的顺序有区别,会按照书写顺序执行

  const p = Promise.all([api1, api2])
    .finally((finData) => {
      console.log("finally")
    })    .then(res => {
      console.log('then')
    })
    .catch(err => {
      console.log('err')
    })
    
结果一次会执行为:
finally
then
catch