本文方法在浏览器端我们可以使用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