Показать сообщение отдельно
  #12 (permalink)  
Старый 01.07.2018, 11:53
Интересующийся
Отправить личное сообщение для arealhz Посмотреть профиль Найти все сообщения от arealhz
 
Регистрация: 21.01.2017
Сообщений: 11

Сообщение от Aetae Посмотреть сообщение
1. setTimeout - не возвращает промис, его бесполезно await.
2. ключевое слово await имеет смысл использовать именно там, где ты что-то ждёшь.(а конкретно исключительно перед промисом или вызовом async функции) Если async функция вызвана без этого ключевого слова - то она просто вызвана, дальнейший код не ждёт асинхронного ответа, независимо от того, что там у ней внутри.

Примерно так должен был выглядеть код:
"use strict";
'esversion: 6';
(async function(){

  function procData(val, i){
    return new Promise((resolve, reject) => setTimeout(() => {
      var ret = i + "\t" + val + " #";
      console.log(ret);
      resolve(ret)
    }, 3000));
  }


  var arr = [3, 5, "asdf", 8, 0];

  for(let n in arr){
    await procData(arr[n],n)
  }

}())
Сегодня баловался самой констуркцией. Пришел к вот такому рабочему варианту:

"use strict";
'esversion: 6';
(async function(){
 
  function procData(val, i){
    return new Promise((resolve, reject) => setTimeout(() => {
      var ret = i + "\t" + val + " #";
      console.log(ret);
      resolve(ret)
    }, 3000));
  }
 
 
  var arr = [3, 5, "asdf", 8, 0];
  var retArr = [];
 
  for(let n in arr){
    retArr.push(await procData(arr[n],n));
  }
 
  Promise.all(retArr).then((ret)=>{console.log(ret)});
}())


Оно работает, но я по прежнему не понимаю, почему все работает внутри безымянной функции с пометкой async, которая ещё и сразу вызывается, после объявления. Почему нельзя поставить async перед функцией внутри которой создается промис, почему нельзя поставить await перед самим промисом? Одни вопросы. Прочитал несколько статей на хабре, но материал, можно сказать, не усвоил. Но при этом с калбеками вроде более менее разобрался и ужасную лапшу из них строить могу А вот промисы и async/await не даются.
Ответить с цитированием