Я занят с 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);
});
};
Таким образом, поскольку обещание является асинхронным, как приведенный выше код автора может вернуть уже заполненный массив, если обратные вызовы, переданные обещаниям, возможно, еще не выполнялись. :)