- 练习
- 跟踪手术刀
- 构建
Promise.all
练习
跟踪手术刀
村里的乌鸦拥有一把老式的手术刀,他们偶尔会用于特殊的任务 - 比如说,切开纱门或包装。 为了能够快速追踪到手术刀,每次将手术刀移动到另一个鸟巢时,将一个条目添加到拥有它和拿走它的鸟巢的存储器中,名称为"scalpel"
,值为新的位置。
这意味着找到手术刀就是跟踪存储器条目的痕迹,直到你发现一个鸟巢指向它本身。
编写一个异步函数locateScalpel
,它从它运行的鸟巢开始。 你可以使用之前定义的anyStorage
函数,来访问任意鸟巢中的存储器。 手术刀已经移动了很长时间,你可能会认为每个鸟巢的数据存储器中都有一个"scalpel"
条目。
接下来,再次写入相同的函数,而不使用async
和await
。
在两个版本中,请求故障是否正确显示为拒绝? 如何实现?
async function locateScalpel(nest) {
// Your code here.
}
function locateScalpel2(nest) {
// Your code here.
}
locateScalpel(bigOak).then(console.log);
// → Butcher Shop
构建Promise.all
给定Promise
的数组,Promise.all
返回一个Promise
,等待数组中的所有Promise
完成。 然后它成功,产生结果值的数组。 如果数组中的一个Promise
失败,这个Promise
也失败,故障原因来自那个失败的Promise
。
自己实现一个名为Promise_all
的常规函数。
请记住,在Promise
成功或失败后,它不能再次成功或失败,并且解析它的函数的进一步调用将被忽略。 这可以简化你处理Promise
的故障的方式。
function Promise_all(promises) {
return new Promise((resolve, reject) => {
// Your code here.
});
}
// Test code.
Promise_all([]).then(array => {
console.log("This should be []:", array);
});
function soon(val) {
return new Promise(resolve => {
setTimeout(() => resolve(val), Math.random() * 500);
});
}
Promise_all([soon(1), soon(2), soon(3)]).then(array => {
console.log("This should be [1, 2, 3]:", array);
});
Promise_all([soon(1), Promise.reject("X"), soon(3)])
.then(array => {
console.log("We should not get here");
})
.catch(error => {
if (error != "X") {
console.log("Unexpected failure:", error);
}
});