Promise的集合

每台鸟巢计算机在其neighbors属性中,都保存了传输距离内的其他鸟巢的数组。 为了检查当前哪些可以访问,你可以编写一个函数,尝试向每个鸟巢发送一个"ping"请求(一个简单地请求响应的请求),并查看哪些返回了。

在处理同时运行的Promise集合时,Promise.all函数可能很有用。 它返回一个Promise,等待数组中的所有Promise解析,然后解析这些Promise产生的值的数组(与原始数组的顺序相同)。 如果任何Promise被拒绝,Promise.all的结果本身被拒绝。

  1. requestType("ping", () => "pong");
  2. function availableNeighbors(nest) {
  3. let requests = nest.neighbors.map(neighbor => {
  4. return request(nest, neighbor, "ping")
  5. .then(() => true, () => false);
  6. });
  7. return Promise.all(requests).then(result => {
  8. return nest.neighbors.filter((_, i) => result[i]);
  9. });
  10. }

当一个邻居不可用时,我们不希望整个组合Promise失败,因为那时我们仍然不知道任何事情。 因此,在邻居集合上映射一个函数,将它们变成请求Promise,并附加处理器,这些处理器使成功的请求产生true,拒绝的产生false

在组合Promise的处理器中,filter用于从neighbors数组中删除对应值为false的元素。 这利用了一个事实,filter将当前元素的数组索引作为其过滤函数的第二个参数(mapsome和类似的高阶数组方法也一样)。