Красноречивый javascript глава 11 Асинхронность обещаний - PullRequest
1 голос
/ 25 апреля 2020

Я занят с Eloquent Javascript главой 11 и упражнением по созданию собственной функции Promise.all, которая действует точно так же, как встроенная. Это определение, которое я сделал, увидев авторов, но если только я не использую setTimeout для выполнения resol () для обещания разрешить, то разрешение получает пустой массив.

function Promise_all(promises) {
  return new Promise((resolve, reject) => {
let pending = promises.length;
let output = [];

for(let  i = 0 ;i < promises.length;i++){
promises[i].then((v)=>{output[i] = v;pending--}).catch((error)=>{reject(error)})    
}
if(pending == 0){resolve(output)}
//I would have to do something like this 
//setTimeout(()=>{if(pending == 0){resolve(output)}},100)
  });
}

В то время как аналогичное определение Auothor работает.

function Promise_all(promises) {
  return new Promise((resolve, reject) => {
    let results = [];
    let pending = promises.length;
    for (let i = 0; i < promises.length; i++) {
      promises[i].then(result => {
        results[i] = result;
        pending--;
        if (pending == 0) resolve(results);
      }).catch(reject);
    }
    if (promises.length == 0) resolve(results);
  });
};

Таким образом, поскольку обещание является асинхронным, как приведенный выше код автора может вернуть уже заполненный массив, если обратные вызовы, переданные обещаниям, возможно, еще не выполнялись. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...