Показать сообщение отдельно
  #15 (permalink)  
Старый 01.07.2018, 12:14
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,495

for(let n in arr){
    retArr.push(await procData(arr[n],n));
  }
 
  Promise.all(retArr).then((ret)=>{console.log(ret)});
Это излишне.
Достаточно либо:
for(let n in arr){
    retArr.push(procData(arr[n],n));
  }
 
  Promise.all(retArr).then((ret)=>{console.log(ret)});
наполняем массив промисами, затем ждём выпонениния всех.
Либо:
for(let n in arr){
    retArr.push(await procData(arr[n],n));
  }
 
  console.log(retArr)
наполняем массив ожидая выполнения каждого промиса по очереди.

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

Цитата:
Почему нельзя поставить async перед функцией внутри которой создается промис, почему нельзя поставить await перед самим промисом?
Можно. Только если вызывать async функцию не поставив перед самим вызовом await, то ждать её вырлнения код не будет, и, хотя сам асинронный код в функции выполнится, но отдельно, не возвращая результата и не откладывая выполнения остального кода.

Цитата:
Но при этом с калбеками вроде более менее разобрался и ужасную лапшу из них строить могу А вот промисы и async/await не даются.
С коллбэков переходите на промисы. Самый постой вариант понять, как это работает - написать свой класс Promise, что абсолютно реализуемо классическими методами. (Если не получается - погуглить "промис полифил" и разобраться что да как)
__________________
29375, 35

Последний раз редактировалось Aetae, 01.07.2018 в 12:19.
Ответить с цитированием