javascript - 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 的回调可能尚未运行,那么作者上面的代码如何能够返回一个已经填写的数组。:)
解决方案
推荐阅读
- sql - PostgreSQL 11 - 使用格式分配给变量
- git - 如何撤消删除我所有文件的“ git rm -r . -f ”命令?
- json - 在 Spark RDD 中聚合 JSON 文件
- domain-driven-design - Lightbend 反应式架构认证
- google-sheets - 使用 2 个电子表格的条件格式和 Importrange
- javascript - React native ScrollView 重置 setState 上的位置
- asp.net - IIS 服务于旧版本的文件
- python - Python打印WebView的内容(Gtk3.0)
- javascript - 在 Chrome 扩展中使用语义 UI 反应?
- java - 底部应用栏问题