Promise
的集合
每台鸟巢计算机在其neighbors
属性中,都保存了传输距离内的其他鸟巢的数组。 为了检查当前哪些可以访问,你可以编写一个函数,尝试向每个鸟巢发送一个"ping"
请求(一个简单地请求响应的请求),并查看哪些返回了。
在处理同时运行的Promise
集合时,Promise.all
函数可能很有用。 它返回一个Promise
,等待数组中的所有Promise
解析,然后解析这些Promise
产生的值的数组(与原始数组的顺序相同)。 如果任何Promise
被拒绝,Promise.all
的结果本身被拒绝。
requestType("ping", () => "pong");
function availableNeighbors(nest) {
let requests = nest.neighbors.map(neighbor => {
return request(nest, neighbor, "ping")
.then(() => true, () => false);
});
return Promise.all(requests).then(result => {
return nest.neighbors.filter((_, i) => result[i]);
});
}
当一个邻居不可用时,我们不希望整个组合Promise
失败,因为那时我们仍然不知道任何事情。 因此,在邻居集合上映射一个函数,将它们变成请求Promise
,并附加处理器,这些处理器使成功的请求产生true
,拒绝的产生false
。
在组合Promise
的处理器中,filter
用于从neighbors
数组中删除对应值为false
的元素。 这利用了一个事实,filter
将当前元素的数组索引作为其过滤函数的第二个参数(map
,some
和类似的高阶数组方法也一样)。