企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## Promise 快捷方式 ### Promise.resolve() 和 Promise.reject() 可以使用 Promise.resolve() 和 Promise.reject() 快捷返回,比如 : ``` function p (num) { if (num >= 0) { return Promise.resolve(num) } else { return Promise.reject(new Error('参数不能小于 0')) } } ``` ### Promise.all JavaScript 还提供了 Promise.all,但它不是什么快捷方式。 可以如下总结它的算法: ``` 接受一个 promise 的数组 等待所有这些 promise 完成 返回一个新的 Promise,将所有的 resolve 结果放进一个数组里 只要有一个 promise 失败(rejected),这个新的 promise 将会被 rejected ``` 示例,函数仍然使用上述 p() 函数 ``` Promise.all([ p(10), p(20) ]).then(console.log) .catch(console.log) ``` 输出 `[10, 20]` 注意: `Promise.all` 是一点不笨,只要有一个 promise 被 reject 了,它就直接 reject,不会等到其他 promise 完成。 ### Promise.race() `Promise.race`方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。 ``` const p = Promise.race([p1, p2, p3]); ``` 上面代码中,只要`p1`、`p2`、`p3`之中有一个实例率先改变状态,`p`的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给`p`的回调函数。 `Promise.race`方法的参数与`Promise.all`方法一样,如果不是 Promise 实例,就会先调用下面讲到的`Promise.resolve`方法,将参数转为 Promise 实例,再进一步处理。 下面是一个例子,如果指定时间内没有获得结果,就将 Promise 的状态变为`reject`,否则变为`resolve`。 ``` const p = Promise.race([ fetch('/resource-that-may-take-a-while'), new Promise(function (resolve, reject) { setTimeout(() => reject(new Error('request timeout')), 5000) }) ]); p .then(console.log) .catch(console.error); ``` 上面代码中,如果 5 秒之内`fetch`方法无法返回结果,变量`p`的状态就会变为`rejected`,从而触发`catch`方法指定的回调函数。