premise常见笔试题
参考: www.explainthis.io/zh-hans/swe… blog.csdn.net/2401_873133…
宏任务: setTimeout、setInterval 微任务: promise.then
其他特殊: 一次只会读取一个宏任务,然后就回去看微任务 await: 先将await的结果打印出来,await后面的任务类似于promise放入微任务 new Promise()后面的内容会立即打印 promise中,没有resolve,.then后面的内容不会打印,只有调用resovle,才会走到.then中的内容。 多个.then或者await,当前的.then或者await执行完毕之后,把后续的.then或者await后面的代码继续放到微任务
,Promise构造函数是直接调用的同步代码,resolve如果调用的方法也会立即执行,如果调用的是同步方法就会同步执行,如果是异步方法就会按照异步方法执行
console.log("1");
async function one() {
await two()
console.log("2");
await three()
console.log("3");
}
async function two() {
console.log("4");
}
async function three() {
console.log("5");
}
one()
setTimeout(() => {
console.log("6");
}, 0);
new Promise((resolve) => {
console.log("7");
resolve()
}).then(() =>{
console.log("8");
}).then(() =>{
console.log("9");
})
//1 4 7 2 5 8 3 9 6
1.主线程执行同步代码输出“1”,再调用one函数
2.执行one函数,立即执行two函数输出“4”
3.将two()后面的任务放入微任务队列中
4.跳出one函数中,将定时器任务放入宏任务队列中。
5.执行Promise同步函数输出“7” 在将then中的回调函数放入微队伍队列中
6.主线程任务执行完毕,执行微任务队列,先输出“2”,再执行three()函数
7.输出“5”,在将log(3)放入微队伍队列。
8.输出创建的Promise对象的then回调的函数输出“8”,再将第二个then放入微任务队列
9.执行one函数的最后一个任务,输出“3”
10.在清空微任务队列最后一个“9”
11.微任务队列情况,执行宏任务输出“6”
new Promise ((resolve, reject) => {
console.log (1)
new Promise((resolve, reject) => {
console.log(2)
setTimeout(() => {
resolve(3)
console.log(4)
})
}).then(data => {
setTimeout(() => {
console.log(5)
})
console.log(data)
})
setTimeout(() => {
resolve(6)
console.log(7)
})
}).then(data => {
console.log(data)
setTimeout(() => {
console.log(8)
})
console.log(9)
})
1.主线程执行输出“1”在进入另一个Promise对象中输出“2”,注意:由于resolve在setTimeout宏任务队列中,resolve暂时没有传值,故这里的then不能走,也就不能放入微任务队列中。
2.将第一个setTimeout放入宏任务队列中。再将第二个setTimeout放入宏任务队列中。
3.主线程任务做完,微任务队列是空的,那我们执行宏任务。先执行第一个宏任务。
4.由于resolve(3),将与其对应的then的回调函数放入微任务队列中。再输出“4”
5.第一个宏任务做完,开始做微任务,故来到then的回调函数中,输出“3”,并将输出“5”的定时器放入宏队列中。
6.微任务做完,开始做第二个宏任务,由于resolve(6),将与其对应的then的回调函数放入微任务队列中。在输出“7”。
7.与步骤五一样,开始做微任务队列,输出传进去的data,输出“6”再将输出“8”的计时器放入宏任务队列中,在输出“9”
8.最后,微任务做完,开始搞宏任务了!。俩个定时器内容,输出“5”输出“8”完成。
new Promise(() => {
console.log('');
throw new Error('error1');
})
.catch(() => {
console.log('2');
})
.then(() => {
console.log('3');
});
创建 Promise 对象:
new Promise 的回调函数是同步执行的,所以会立即执行函数体内部代码。
console.log(''); 输出一个空行。
接着抛出了一个错误 throw new Error('error1');。
由于这个错误并没有在 new Promise 内部处理,因此它会导致该 Promise 直接进入 rejected 状态。
catch 捕获错误:
.catch() 是用来捕获 Promise 的 rejected 状态的。
当前 Promise 是 rejected 状态,所以 .catch() 会被触发。你会看到 console.log('2'); 输出 2。
then 链式调用:
.then() 在 .catch() 之后链式调用。
需要注意的是,如果 .catch() 没有抛出其他错误或者返回一个 rejected 状态的 Promise,它会返回一个 resolved 状态的 Promise。
因此,.then() 中的回调函数会被执行,并输出 console.log('3');。