Асинхронность и множественные ожидания | Приостановка стека вызовов

Я работаю с обещаниями и асинхронной функцией. Я узнал, что внутри асинхронной функции, если есть механизм ожидания выхода 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 секунд. Пожалуйста, дайте мне понять, заранее спасибо!!!..

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
57
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Выполняются ли эти обещания параллельно?

Да. Выполнение кода не останавливается на 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 секунд.

Идеальный. Спасибо!!

Manthan Sharma 09.07.2024 07:21

Выполняются ли эти обещания параллельно?

Обещания не выполняются. Это объекты, а не функции.

Обратный вызов, который вы передали new Promise, выполняется немедленно (синхронно), поэтому в вашем случае первый вызов setTimeout() выполняется еще до того, как будет создано второе обещание. Затем выполняется второй обратный вызов, который также выполняет setTimeout(). Наконец, выполняется синхронный скрипт handelPr(), который, в свою очередь, приостанавливается при первом await.

Но в это время оба таймера уже запланированы (это зависит от кода, отличного от JavaScript). Поскольку оба вызова setTimeout были совершены почти в одно и то же время, их тайм-ауты не суммируются: первый истечет примерно через 5 секунд с момента совершения этих вызовов setTimeout, а второй — примерно через 10 секунд с того же момента времени.

В вашем скрипте нет одновременного выполнения кода JavaScript. Просто два таймера начали свой «обратный отсчет» примерно в одно и то же время.

Другие вопросы по теме