- 练习
- 跟踪手术刀
- 构建
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);}});
