Я работаю с обещаниями и асинхронной функцией. Я узнал, что внутри асинхронной функции, если есть механизм ожидания выхода JS, он приостанавливает текущие вызовы функций стека вызовов и ждет завершения ожидаемого обещания. Вопрос в том, позвольте мне сначала поставить код: -
const pr = new Promise((res, rej) => {
setTimeout(() => {
res("promise Execution done")
}, 5000);
});
const pr2 = new Promise((res, rej) => {
setTimeout(() => {
res("promise Execution done222222")
}, 10000);
});
async function handelPr() {
const val1 = await pr;
console.info("Hello");
console.info(val1);
const val2 = await pr2;
console.info("Hello-->");
console.info(val2);
}
handelPr()Вот что я вижу на консоли: после 5 секунд pr разрешился и вернул значение, но еще через 5 секунд pr2 вернул значение, но я думаю, что после того, как pr вернул значение, pr2 должно занять 10 секунд, а не 5 секунд, какова текущая сцена. Я предполагаю, что весь процесс должен занять 15 секунд, а не 10 секунд. Выполняются ли эти обещания параллельно? Или мне что-то не хватает в цикле событий? Другое дело, если я изменю время pr на 10 секунд и pr2 на 5 секунд, то это тоже займет 5 секунд. Пожалуйста, дайте мне понять, заранее спасибо!!!..



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Выполняются ли эти обещания параллельно?
Да. Выполнение кода не останавливается на pr. pr и pr2 вызываются почти одновременно
«Эти обещания выполняются параллельно?»
Да.
Эти операции начинают выполняться при их создании, здесь:
const pr= new Promise((res,rej) =>{
setTimeout(()=>{res("promise Execution done")},5000);
});
const pr2= new Promise((res,rej) =>{
setTimeout(()=>{res("promise Execution done222222")},10000);
});
Таким образом, эти тайм-ауты создаются немедленно (и достаточно близко к одновременному, чтобы любая разница не имела значения). Один выполнится через 5 секунд прямо сейчас, другой — через 10 секунд.
Итак, когда вы ждете первого:
const val1 = await pr;
Это будет ждать, пока не пройдут эти 5 секунд. Но эти 5 секунд пройдут для обоих промисов. Итак, до второго осталось всего 5 секунд:
const val2 = await pr2;
Чтобы добиться нужной функциональности, вы можете изменить pr и pr2 на функции, которые создают и возвращают промисы. Например:
const pr = () => new Promise((res,rej) =>{
setTimeout(()=>{res("promise Execution done")},5000);
});
const pr2 = () => new Promise((res,rej) =>{
setTimeout(()=>{res("promise Execution done222222")},10000);
});
Эти строки кода не создают (и впоследствии не вызывают) промисы до тех пор, пока эти функции не будут фактически вызваны. Если вы хотите их дождаться, вызовите функции и дождитесь результатов:
async function handelPr(){
const val1 = await pr(); // <-- here
console.info("Hello");
console.info(val1);
const val2 = await pr2(); // <-- and here
console.info("Hello-->");
console.info(val2);
}
handelPr()
В этом случае обещание из pr2 не создается до тех пор, пока не будет вызван pr2(), то есть через первые 5 секунд.
Выполняются ли эти обещания параллельно?
Обещания не выполняются. Это объекты, а не функции.
Обратный вызов, который вы передали new Promise, выполняется немедленно (синхронно), поэтому в вашем случае первый вызов setTimeout() выполняется еще до того, как будет создано второе обещание. Затем выполняется второй обратный вызов, который также выполняет setTimeout(). Наконец, выполняется синхронный скрипт handelPr(), который, в свою очередь, приостанавливается при первом await.
Но в это время оба таймера уже запланированы (это зависит от кода, отличного от JavaScript). Поскольку оба вызова setTimeout были совершены почти в одно и то же время, их тайм-ауты не суммируются: первый истечет примерно через 5 секунд с момента совершения этих вызовов setTimeout, а второй — примерно через 10 секунд с того же момента времени.
В вашем скрипте нет одновременного выполнения кода JavaScript. Просто два таймера начали свой «обратный отсчет» примерно в одно и то же время.
Идеальный. Спасибо!!