当JS中存在多个回调函数时,它们的执行顺序由它们注册的顺序决定。考虑以下例子:
setTimeout(() => {
console.log('Timeout callback');
}, 0);
Promise.resolve().then(() => {
console.log('Promise callback');
});
这里我们有一个setTimeout回调和一个promise回调。许多人会认为,setTimeout的回调先于Promise回调执行,因为setTimeout的时间间隔为0,无论如何都会先执行。然而,实际执行结果是Promise回调先执行,因为Promise回调是由微任务处理的,而setTimeout回调是由宏任务处理的。
具体来说,当推入promise回调函数时,它会被添加到当前执行线程的微任务队列中,并在当前宏任务结束之前执行。此时setTimeout回调被添加到了属于下一批宏任务的任务队列中,因此当宏任务结束并开始另一个任务时,setTimeout回调会在Promise回调之后执行。
另一个例子:
setTimeout(() => {
console.log('Timeout callback');
Promise.resolve().then(() => {
console.log('Promise callback');
});
}, 0);
在这种情况下,setTimeout回调函数先执行,但是由于promise回调函数是由setTimeout回调函数内的微任务队列处理的,因此Promise回调函数在setTimeout回调函数执行结束后立即执行。
总之,当存在多个回调函数时,我们必须要考虑它们注册的顺序和它们所属的队列类型,以确定它们的执行顺序。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS promise 的回调和 setTimeout 的回调到底谁先执行 - Python技术站