一、Promise 概述
Promise 对象
用于表示一个异步操作
的最终完成 (或失败)及其结果值。
#. Promise 有 3 个状态
- 待定(pending): 初始状态,既没有被兑现,也没有被拒绝。
- 已兑现(fulfilled): 意味着操作成功完成。
- 已拒绝(rejected): 意味着操作失败。
#. Promise 有 2 个方法
Promise.prototype.then
Promise.prototype.catch
当然,就像常规 try {...} catch {...}
中的 finally 子句一样,promise 中也有 finally。
finally
是执行清理(cleanup)的很好的处理程序(handler),例如无论结果如何,都停止使用不再需要的加载指示符(indicator)
1
2
3
4
5
6
7
8
|
new Promise((resolve, reject) => {
/* 做一些需要时间的事儿,然后调用 resolve/reject */
})
// 在 promise 为 settled 时运行,无论成功与否
.finally(() => stop loading indicator)
// 所以,加载指示器(loading indicator)始终会在我们处理结果/错误之前停止
.then(result => show result, err => show error)
|
#. Promise 有 2 个参数
resolve(value)
— 如果任务成功完成并带有结果 value。
reject(error)
— 如果出现了 error,error 即为 error 对象。
二、Promise 使用方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
// 创建Promise
let myPromise = new Promise((myResolve, myReject) => {
myResolve(); // when successful
myReject(); // when error
});
// 使用Promise
myPromise.then(
function (value) {
/* code if successful */
},
function (error) {
/* code if some error */
}
);
|
实例
1
2
3
4
5
6
7
8
9
10
11
|
new Promise((res, rej) => {
setTimeout(() => res(1), 1000);
})
.then((res) => {
console.log(res); // 1
return res * 2;
})
.then((res) => {
console.log(res); // 2
});
|
三、async/await
- 简单来说,它们是基于 promises 的语法糖,使异步代码更易于编写和阅读。
- 通过使用它们,异步代码看起来更像是老式同步代码。
- !!!这才是所有回调的
最佳
(至少目前来说)使用方式!!!
#. function 中的使用方法
1
2
3
4
5
6
|
(async () => {
let response = await fetch('/article/promise-chaining/user.json');
let user = await response.json();
...
})();
|
#. class 中的使用方法
1
2
3
4
5
6
7
8
9
10
|
class Waiter {
async wait() {
return await Promise.resolve(1);
}
}
new Waiter()
.wait()
.then(alert); // 1(alert 等同于 result => alert(result))
|