
const promise = new Promise((resolve, reject) => {
console.log(1);
resolve();
console.log(2);
})
promise.then(() => {
console.log(3);
})
console.log(4);1
2
4
3promise.then() 中的代码,输出 3console.log('script start');
setTimeout(function(){
console.log('setTimeout');
},0);
new Promise(function(resolve){
console.log('promise1');
resolve();
console.log('promise2');
}).then(function(){
console.log('promise then');
});
console.log('script end');script start
promise1
promise2
script end
promise then
setTimeoutconst promise = new Promise((resolve, reject) => {
resolve('success1');
reject('error');
resolve('success2');
});
promise.then((res) => {
console.log('then:', res);
}).catch((err) => {
console.log('catch:', err);
})then: success1这里考察了 promise 的单向传递的特点,promise 有三种状态:
这三种状态的转移只能是 padding -> resolved 或 padding -> rejected。不会出现 resolved -> rejected 或者 padding -> resolved -> rejected 等等,即状态只能从 padding 单向传递,且只能改变一次。
在 promise 中,resolve() 将 promise 的状态变为 resolved成功时调用,resolved 状态在先,先调用异步函数 promise.then(('success1') => { console.log('then:', 'success1'); })
promise 的状态一旦改变就不能修改了,因此 .catch() 和第二个 resolve('success2') 不会执行。
Promise.resolve(1)
.then(2)
.then(Promise.resolve(3))
.then(console.log)1.then() 中的参数必须是函数,如果是非函数,则会发生值穿透,最终执行第三个 .then() 函数,参数为 1。
Promise.resolve(1)
.then((res) => {
console.log(res)
return 2
})
.catch((err) => {
return 3
})
.then((res) => {
console.log(res)
})1
2promise.resolve() 返回一个新的 promise,执行第一个 .then(),参数为 1return 返回一个新的 promise,参数为 2.then(),参数为 2,并打印出 2Promise.resolve()
.then(() => {
return new Error('error!!!')
})
.then((res) => {
console.log('then: ', res)
})
.catch((err) => {
console.log('catch: ', err)
})then: Error: error!!!这里的陷阱在于只有抛出错误时才会执行 .catch(),题目中并不是抛出错误,所以执行 .then()。
改成如下方式会执行 .catch():
return Promise.reject(new Error('error!!!'))throw new Error('error!!!')const promise = Promise.resolve()
.then(() => {
return promise
})
promise.catch(console.error)程序报错:
TypeError: Chaining cycle detected for promise #<Promise>.then() 或 .catch() 返回的值不能是 promise 本身,否则会造成死循环。
setTimeout(() => {
console.log(1)
Promise.resolve(3).then(data => console.log(data))
}, 0)
setTimeout(() => {
console.log(2)
}, 0)1
3
2这道题有点不一样的是,Promise 回调这个微任务,是在 setTimeout 回调这个宏任务中,被触发的。不过无论怎样,它们都遵循 Event Loop 的模型规则。
var pro = new Promise((res,rej)=>{
res(1);
});
pro.then(res=>{
console.log(res);
});
setTimeout(()=>{
console.log(2);
})
pro.then(res=>{
console.log(res);
})1
1
2promise 对象赋值给了变量 pro,每个 .then() 都是独立的。
async function async1 () {
console.log('async1 start');
await async2();
console.log('async1 end');
}
async function async2 () {
console.log('async2');
}
console.log('script start');
setTimeout(function () {
console.log('setTimeout');
}, 0);
async1()
new Promise (function (resolve) {
console.log('promise1');
resolve();
}).then (function () {
console.log('promise2');
})
console.log('script end');script start
async1 start
async2
promise1
script end
async1 end
promise2
setTimeout注意以下几点:
async1(),async2(),不会立即执行await async2(); 表示先执行 async2(),然后将 await 后面的代码当作 .then() 中的回调来处理基本上所有与异步相关的问题都可以用 event loop 来解释。最后,我们再来回顾一遍 event loop 的执行规则:
(个人疏漏之处在所难免,如有问题欢迎指出哦😊)