@ince

Как понять промисы?

Непонятно, почему эта херня будет выполняться параллельно.
Предлагаю разобрать по словам им написанное.
Поясните умственно неполноценному мне.

Вот функция, она возвращает промис. Что значит возвращает промис?
Что значит промис. Промис, это спецобъект, содержащий свое состояние и инструкции, которые необходимо исполнить после достижения того или иного состояния. Так? Так.
Какой промис возвращает функция - разрешенный или нет?

function pause500ms() {  
    return new Promise( (res) => setTimeout(res, 500) );  // Что там в качестве аргумента указано - (res) => setTimeout(res, 500) // Это функция, которая исполняется при положительном исполнении промиса?
}

async function inParallel() {               // Тут понятно - объявляется асинхронная функция
    const await1 = await pause500ms();      // Тут уже не понятно. В константу await1 записывается функция(?) или результат ее исполнения, а именно промис? 
    const await2 = await pause500ms();
    await await1;                           // А здесь, получается, функция вызывается? 
    await await2;
    console.log("I will be logged after 500ms");
}

Ничего не понятно.

Только не надо мне советовать читать основы, я learnjavascript и mozilla читал.
Хотя если есть годная книжка или лекция, то не откажусь.
  • Вопрос задан
  • 396 просмотров
Решения вопроса 1
rockon404
@rockon404
Frontend Developer

Не понятно почему эта херня будет выполняться параллельно

Она не будет выполняться параллельно. Она будет выполняться последовательно.
const await1 = await pause500ms();  // ожидаем 500мс разрешение промиса и получаем undefined
const await2 = await pause500ms(); // ожидаем 500мс разрешение промиса и получаем undefined
await await1;  // передаем undefined и получаем разрешенный промис
await await2;  // передаем undefined и получаем разрешенный промис
console.log("I will be logged after 500ms"); // No, you will be logged after 1000ms


Вызовы await await1; и await await2; на первый взгляд не оказывают влияния на код, но это не так.
Пример1
(async() => {
  await console.log(1);
  console.log(2);
})();
console.log(3);

// 1
// 3
// 2

Демо
Пример2
(async() => {
  await console.log(1);
  await console.log(2);
  console.log(3);
})();
console.log(4);

(async() => {
  await console.log(5);
  console.log(6);
})();
console.log(7);

// 1
// 4
// 5
// 7
// 2
// 6
// 3

Демо
 

Какой промис возвращает функция - разрешенный или нет?

Не разрешенный. Он разрешается через 500ms когда setTimeout вызывает res. Вашу функцию можно переписать так:
function pause500ms() {  
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(); // вот тут разрешается созданный Promise
      }, 500);
    }); 
}


В константу await1 записывается функция(?) или результат ее исполнения, а именно промис?

await1 и await2 получают Promise, но когда он разрешается он ничего не возвращает, поэтому дальше в коде они имеют значение undefined.

А здесь, получается, функция вызывается?

await1 и await2 имеют значение undefined. Оператор await получает undefined и вызов:
await await1;
await await2;
console.log("I will be logged after 500ms");

равносилен:
Promise.resolve(undefined).then(() => {
  Promise.resolve(undefined).then(() => {
    console.log("I will be logged after 500ms");
  });
});


Что значит возвращает промис?
// Что значит промис. Промис, это спецобъект, содержащий свое состояние и инструкции, которые необходимо исполнить после достижения того или иного состояния. Так? Так.

Тут уже лучше читать теорию. На том же MDN дается разжеванный ответ. Понимание придет с практикой. Просто пишите асинхронный код.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
hzzzzl
@hzzzzl
https://codepen.io/anon/pen/rgJMqV?editors=1010

// Вот функция, она возвращает промис. Что значит возвращает промис?
// Что значит промис. Промис, это спецобъект, содержащий свое состояние и инструкции, которые необходимо исполнить после достижения того или иного состояния. Так? Так.
// Какой промис возвращает функция - разрешенный или нет?


не разрешенный, но он разрешается в результат resolve или в ошибку reject когда ты await или .then()

то есть

const bla = await promiseFunc()
в bla будет уже результат промиса
Ответ написан
Комментировать
Попробуйте почитать вот это: Клик
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы