首页 > 解决方案 > Eloquent javascript 第 11 章承诺异步

问题描述

我忙于Eloquent Javascript 第 11 章以及构建自己的 Promise.all 函数的练习,该函数的作用与内置函数完全相同。这是我在看到作者后所做的定义,但除非我使用 setTimeout 来执行 resolve()承诺解析,一个空数组是解析接收的。

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)
  });
}

虽然作者的类似辩护有效。

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);
  });
};

因此,由于 A Promise 是异步的,如果传递给 Promise 的回调可能尚未运行,那么作者上面的代码如何能够返回一个已经填写的数组。:)

标签: javascriptasynchronouses6-promise

解决方案


推荐阅读