You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Eloquent JS中Promise.all示例疑问:可用邻居节点筛选逻辑解析

解析《Eloquent JavaScript》中availableNeighbors函数的筛选逻辑

先看原函数代码:

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]);
  });
}

你已经理解了前半部分:nest.neighbors.map会把每个邻居转换成一个Promise,这个Promise最终会变成true(邻居能ping通)或false(ping不通)。Promise.all(requests)会等所有Promise都完成,得到一个和nest.neighbors索引完全对应的布尔数组result——比如nest.neighbors是["A", "B", "C"],那result可能是[true, false, true],对应A通、B不通、C通。

重点说filter的部分:

  • filter方法遍历nest.neighbors的每个元素时,会传入两个参数:当前元素(这里用下划线_表示,因为我们不需要用到它)、当前元素的索引i。
  • 回调函数里用result[i]判断是否保留当前元素:如果result[i]是true,就保留对应的邻居;如果是false,就过滤掉该邻居。

举个具体例子:
假设nest.neighbors = ["alpha", "beta", "gamma"],经过Promise.all后得到result = [true, false, true]。
遍历nest.neighbors时:

  1. 第一个元素alpha,索引0,result[0]为true,保留alpha;
  2. 第二个元素beta,索引1,result[1]为false,过滤掉beta;
  3. 第三个元素gamma,索引2,result[2]为true,保留gamma。

最终返回的就是["alpha", "gamma"],也就是所有能正常接收消息的邻居节点。

内容的提问来源于stack exchange,提问作者user10673486

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 11:45:28