我有一个集群数组,其中每个集群都包含一组功能。我使用两个forEach语句来遍历群集和功能,以便将每个功能存储在“结果”数组中。

我需要进一步处理“结果”数组。但是,当我要求数组的长度时,虽然我可以在控制台中看到其中包含功能,但可以说该长度为0。我需要找到一种方法,仅在forEach循环完成时才处理“结果”数组。

我已经读过这个问题,它是由JavaScript中的异步数据处理引起的。我已经尝试注册一个Promise,但是我无法使其工作,因为在示例中始终使用一个forEach循环,但是彼此之间有两个forEach循环。

这是我的代码:

var result = [];

clusters.forEach((cluster) => {
  getFeatures(cluster_id, (features) => {
  features.forEach((feature) => {
    result.push(feature);
  });
  });
});

//do something with result array
console.log("resulting features array length: " + result.length); //results in 0

最佳答案

实际上,您实际上不需要内部的forEach,因为只需将功能复制到可以使用.push(...stuff)完成的结果中,您就必须保证getFeatures能够在所有promise上调用Promise.all来等待他们全部完成:

const result = [];

const allDone = Promise.all(clusters.map((cluster) => new Promise(resolve => {
  getFeatures(cluster_id, (features) => {
    result.push(...features);
    resolve();
  });
})));

allDone.then(() => {
  // result is ready to use here
});


如果您需要按顺序排列结果,则可以用它们解决承诺,然后将结果展平:

 const allDone = Promise.all(clusters.map((cluster) => new Promise(resolve => {
  getFeatures(cluster_id, (features) => {
    resolve(features);
  });
})));

allDone.then((nestedResults) => {
  const result = nestedResults.flat();
  //...
});

关于javascript - 等待多个for-each语句完成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55363839/

10-13 07:04