Promise 基础
Promise 以待处理状态开始,既不履行也不拒绝。
当操作完成时,一个 promise 将被一个 value 实现。
如果操作失败,promise 将被拒绝并返回错误。
创建 Promise
传递给 Promise 构造函数将同步执行。
使用 resolve() 或 reject() 函数从值创建 Promise。
Promise.resolve(val) 将兑现Promise val。
Promise.reject(err) 将 err 拒绝.
如果把一个已履行的Promise放入一个已履行的 Promise 中,它们就会合二为一。
new Promise((resolve, reject) => {
performOperation((err, val) => {
if (err) reject(err);
else resolve(val);
});
});
//无需值返回,无需值拒绝
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
处理 Promise
Promise.prototype.then() 接受两个可选参数 ( onFulfilled, onRejected)。
Promise.prototype.then() 承诺一旦实现就会调用 onFulfilled 。
Promise.prototype.then() 如果 promise 被拒绝,将调用 onRejected。
Promise.prototype.then() 如果 onRejected 为 undefined ,将返回错误。
Promise.prototype.catch() 接受一个参数 ( onRejected)。
Promise.prototype.catch() 行为与 Promise.prototype.then() 触发 whenonFulfilled 时类似。
Promise.prototype.catch() 传递已实现的值。
Promise.prototype.finally() 接受一个参数 ( onFinally)。
Promise.prototype.finally() 一旦有任何结果可用,就调用不带参数的 onFinally 。
Promise.prototype.finally() 通过输入承诺。
promisedOperation()
.then(
val => value + 1, // 完成承诺后调用
err => { // 如果 promise 被拒绝则调用
if (err === someKnownErr) return defaultVal;
else throw err;
}
)
.catch(
err => console.log(err); //如果 promise 被拒绝则调用
)
.finally(
() => console.log('Done'); //有任何结果可用时调用
);
上述所有三种方法至少要等到下一个刻才会执行,即使对于已经有结果的 Promise 也是如此。
结合 Promise
Promise.all() 将一个 promise 数组变成一个数组的 promise。
如果任何承诺被拒绝,将返回错误。
Promise.race() 通过第一个已确定的承诺。
Promise
.all([ p1, p2, p3 ])
.then(([ v1, v2, v3 ]) => {
//值总是按承诺的顺序响应
// 不是他们解决的顺序(即 v1 对应于 p1)
});
Promise
.race([ p1, p2, p3 ])
.then(val => {
// val 将采用第一个已解决的承诺的值
})
异步/等待
调用 async 函数总是会产生一个承诺。
(async () => value)() 将返回 value。
(async () => throw err)() 将拒绝错误。
await 等待一个 promise 被实现并返回它的值。
await 只能在 async 函数中使用。
await 也接受非承诺值。
await 即使在等待已经履行的承诺或非承诺值时,也总是至少等到下一个应答才解决。
async () => {
try {
let val = await promisedValue();
//此处处理业务逻辑
} catch (err) {
// 此处处理错误逻辑
}
}