Почему обещают. Все ждут медленных микротасов, даже если все обещают немедленно? ⇐ Javascript
-
Anonymous
Почему обещают. Все ждут медленных микротасов, даже если все обещают немедленно?
Примечание: это не дубликат вопросов о блокировке или длительных петли. Здесь нет процессоров или бесконечного цикла-проблема в том, что обещание. Все неожиданно отсрочено из-за не связанных с ними вызовов queemicrotask () . Это тонкое взаимодействие цикла событий/микротаска, а не код блокировки. Удивительно, но обещание. Все все еще, кажется, ждают, пока все они закончат, прежде чем разрешать, даже если сами обещания решаются мгновенно. // This is a synchronous busy loop that blocks the event loop
function busyLoop(iterations) {
const start = Date.now();
while (Date.now() - start < iterations) {
// intentionally blocking
}
}
function microtaskFlood() {
for (let i = 0; i < 1000; i++) {
queueMicrotask(() => {
// Just a microtask that does nothing
});
}
}
async function test() {
console.log('Start');
busyLoop(100); // Blocks event loop synchronously for ~100 ms
// Schedule many microtasks after blocking
microtaskFlood();
// Promise.all waits for these microtasks to finish
await Promise.all([
Promise.resolve('done1'),
Promise.resolve('done2')
]);
console.log('End');
}
test();
< /code>
ожидается: < /strong>
Поскольку как A, так и B разрешены, я ожидал, что обещание будет немедленно разрешить. Это кажется неинтуированным, потому что микротаксика не имеет никакого отношения к или б. Решите, не ожидая не связанных с ними микротаски?>
Подробнее здесь: https://stackoverflow.com/questions/796 ... olve-immed
Примечание: это не дубликат вопросов о блокировке или длительных петли. Здесь нет процессоров или бесконечного цикла-проблема в том, что обещание. Все неожиданно отсрочено из-за не связанных с ними вызовов queemicrotask () . Это тонкое взаимодействие цикла событий/микротаска, а не код блокировки. Удивительно, но обещание. Все все еще, кажется, ждают, пока все они закончат, прежде чем разрешать, даже если сами обещания решаются мгновенно. // This is a synchronous busy loop that blocks the event loop
function busyLoop(iterations) {
const start = Date.now();
while (Date.now() - start < iterations) {
// intentionally blocking
}
}
function microtaskFlood() {
for (let i = 0; i < 1000; i++) {
queueMicrotask(() => {
// Just a microtask that does nothing
});
}
}
async function test() {
console.log('Start');
busyLoop(100); // Blocks event loop synchronously for ~100 ms
// Schedule many microtasks after blocking
microtaskFlood();
// Promise.all waits for these microtasks to finish
await Promise.all([
Promise.resolve('done1'),
Promise.resolve('done2')
]);
console.log('End');
}
test();
< /code>
ожидается: < /strong>
Поскольку как A, так и B разрешены, я ожидал, что обещание будет немедленно разрешить. Это кажется неинтуированным, потому что микротаксика не имеет никакого отношения к или б. Решите, не ожидая не связанных с ними микротаски?>
Подробнее здесь: https://stackoverflow.com/questions/796 ... olve-immed
Мобильная версия