最近看到一篇文章比较好,摘抄下来可以以后学习查看Promise 必知必会(十道题)

1
2
3
4
5
6
7
8
9
const promise = new Promise((resolve, reject) => {
console.log(1);
resolve();
console.log(2);
});
promise.then(() => {
console.log(3);
});
console.log(4);

运行结果

1
2
3
4
1;
2;
3;
4;

解释:Promise 构造函数是同步执行的,promise.then 中的函数是异步执行的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("success");
}, 1000);
});
const promise2 = promise1.then(() => {
throw new Error("error!!!");
});

console.log("promise1", promise1);
console.log("promise2", promise2);

setTimeout(() => {
console.log("promise1", promise1);
console.log("promise2", promise2);
}, 2000);

运行结果

1
2
3
4
5
6
7
8
9
promise1 Promise { <pending> }
promise2 Promise { <pending> }
(node:50928) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: error!!!
(node:50928) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
promise1 Promise { 'success' }
promise2 Promise {
<rejected> Error: error!!!
at promise.then (...)
at <anonymous> }

解释: Promise 只有三种状态:pending,fulfilled 或 reject.状态改变只能 pending->fulfilled 或者 pending->rejected,状态一旦改变则不能再变,上面 promise2 并不是 promise1,而是返回的一个新的 Promise 实例。

1
2
3
4
5
6
7
8
9
10
11
12
13
const promise = new Promise((resolve, reject) => {
resolve("success1");
reject("error");
resolve("success2");
});

promise
.then(res => {
console.log("then: ", res);
})
.catch(err => {
console.log("catch: ", err);
});

运行结果:

1
then: success1;

解释:构造函数中的 resolve 或 reject 只有第一次执行有效,多次调用没有任何作用,呼应代码二结论:promise 状态一旦改变则不能再变。

1
2
3
4
5
6
7
8
9
10
11
Promise.resolve(1)
.then(res => {
console.log(res);
return 2;
})
.catch(err => {
return 3;
})
.then(res => {
console.log(res);
});

运行结果:

1
2
1;
2;

解释:promise 可以链式调用。提起链式调用我们通常会想到通过 return this 实现,不过 Promise 并不是这样实现的。promise 每次调用 .then 或者 .catch 都会返回一个新的 promise,从而实现了链式调用。