0x00
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) })
|
0x01 执行顺序
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)
|
0x02
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)
|
答案 >folded1 2 3 4
| promise1 Promise { <state>: "pending" } promise2 Promise { <state>: "pending" } promise1 Promise { <state>: "fulfilled", <value>: "success" } promise2 Promise { <state>: "rejected", <reason>: Error: "error!!!" }
|
0x03 宏任务与微任务
1 2 3 4 5 6 7 8 9
| setTimeout(() => console.log(5), 0) new Promise(resolve => { console.log(1) resolve(3) Promise.resolve().then(()=> console.log(4)) }).then(num => { console.log(num) }) console.log(2)
|
0x04
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) })
|
0x05
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| const promise = new Promise((resolve, reject) => { setTimeout(() => { console.log('once') resolve('success') }, 1000) })
const start = Date.now() promise.then((res) => { console.log(res, Date.now() - start) }) promise.then((res) => { console.log(res, Date.now() - start) })
|
答案 >folded1 2 3
| once success 1000 注:理想情况为 1000,实际可能是 1000 多 success 1000 注:理想情况为 1000,实际可能是 1000 多
|
0x06
1 2 3 4 5 6 7 8 9 10
| Promise.resolve() .then(() => { return new Error('error!!!') }) .then((res) => { console.log('then: ', res) }) .catch((err) => { console.log('catch: ', err) })
|
0x07
1 2 3 4 5
| const promise = Promise.resolve() .then(() => { return promise }) promise.catch(console.error)
|
答案 >folded1 2 3 4
| SpiderMonkey: TypeError: A promise cannot be resolved with itself. V8: TypeError: Chaining cycle detected for promise #<Promise>
|
0x08
1 2 3 4
| Promise.resolve(1) .then(2) .then(Promise.resolve(3)) .then(console.log)
|
0x09
1 2 3 4 5 6 7 8 9
| Promise.resolve() .then(function success (res) { throw new Error('error') }, function fail1 (e) { console.error('fail1: ', e) }) .catch(function fail2 (e) { console.error('fail2: ', e) })
|
1 2 3 4 5 6 7 8 9 10
| Promise.resolve() .then(function success1 (res) { throw new Error('error') }, function fail1 (e) { console.error('fail1: ', e) }) .then(function success2 (res) { }, function fail2 (e) { console.error('fail2: ', e) })
|
0x0a
1 2 3 4 5 6 7 8 9 10 11
| process.nextTick(() => { console.log('nextTick') }) Promise.resolve() .then(() => { console.log('then') }) setImmediate(() => { console.log('setImmediate') }) console.log('end')
|
答案 >folded1 2 3 4
| end nextTick then setImmediate
|
0x0b
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| const first = () => (new Promise((resolve, reject) => { console.log(3); let p = new Promise((resolve, reject) => { console.log(7); setTimeout(() => { console.log(5); resolve(6); }, 0) resolve(1); }); resolve(2); p.then((arg) => { console.log(arg); }); })); first().then((arg) => { console.log(arg); }); console.log(4);
|
0x0c
1 2 3 4 5
| var p = new Promise((resolve, reject) => { reject(Error('The Fails!')) }) p.catch(error => console.log(error.message)) p.catch(error => console.log(error.message))
|
0x0d
1 2 3 4 5
| var p = new Promise((resolve, reject) => { return Promise.reject(Error('The Fails!')) }) p.catch(error => console.log(error.message)) p.catch(error => console.log(error.message))
|
答案 >folded1
| Uncaught (in promise) Error: The Fails!
|
0x0e
1 2 3 4 5
| var p = new Promise((resolve, reject) => { reject(Error('The Fails!')) }) .catch(error => console.log(error)) .then(error => console.log(error))
|
答案 >folded1 2
| Error: The Fails! undefined
|
0x0f
1 2 3 4 5 6 7
| new Promise((resolve, reject) => { resolve('Success!') }).then(() => { throw Error('Oh noes!') }).catch(error => { return "actually, that worked" }).catch(error => console.log(error.message))
|
0x10
1 2 3 4 5 6 7 8 9
| Promise.resolve('Success!') .then(data => { return data.toUpperCase() }) .then(data => { console.log(data) return data }) .then(console.log)
|
0x11
1 2 3 4 5 6 7 8 9 10 11
| Promise.resolve('Success!') .then(() => { throw Error('Oh noes!') }) .catch(error => { return 'actually, that worked' }) .then(data => { throw Error('The fails!') }) .catch(error => console.log(error.message))
|
0x12
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| const first = () => (new Promise((resolve, reject) => { console.log(3); let p = new Promise((resolve, reject) => { console.log(7); setTimeout(() => { console.log(5); resolve(6); }, 0); resolve(1); }); resolve(2); p.then((arg) => { console.log(arg); }); })); first().then((arg) => { console.log(arg); }); console.log(4);
|
0x13
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| async function async1() { console.log(1); const result = await async2(); console.log(3); }
async function async2() { console.log(2); }
Promise.resolve().then(() => { console.log(4); });
setTimeout(() => { console.log(5); });
async1(); console.log(6);
|
参考资料:
https://zhuanlan.zhihu.com/p/34421918
https://zhuanlan.zhihu.com/p/30797777
https://zhuanlan.zhihu.com/p/98164787
https://juejin.cn/post/6844903986210816013#heading-3
https://juejin.cn/post/6844903605250572302