【发布时间】:2025-12-28 04:55:11
【问题描述】:
在下面的代码中,当循环内的条件满足时,我们无法确定 asyncFunction 的调用顺序。
siblings.forEach(function(sibling, index) {
// This condition may only be satisfied once (only one sibling may have data-selected true)
if (sibling.getAttribute('data-selected') == 'true') {
asyncFunction(sibling);
}
})
asyncFunction(element);
因为我知道 asyncFunction() 返回一个承诺,我可以将它们链接起来以确保顺序:
asyncFunction(sibling).then(asyncFunction(element));
但是如何在考虑条件的情况下做到这一点?
我考虑过将循环包装在一个 Promise 中,当条件满足或循环结束后解决,但这似乎有点令人费解。
// Untested
function checkSiblings(siblings) {
let promise = new Promise(function(resolve, reject) {
siblings.forEach(function(sibling, index) {
if (sibling.getAttribute('data-selected') == 'true') {
resolve(asyncFunction(sibling));
}
})
resolve();
})
}
checkSiblings(siblings).then(asyncFunction(element));
我确信这个问题之前已经解决过,但我找不到合适的搜索键盘。
谢谢
【问题讨论】:
-
循环与异步调用没有任何关系,因此在涉及承诺之前完成循环。此外,
.forEach()现在应该尽量避免使用,因为它的循环控制比普通的for循环要少得多,尤其是当您在找到所需内容时想要中止循环时。 -
对不起@jfriend00,但我不完全理解“在涉及承诺之前完成循环”的意思,你能举个例子吗?谢谢
-
嗯,你在循环中调用
resolve(),它只会在你第一次调用它时对承诺做任何事情。因此,您显然是在循环中的第一个匹配项上解决了一个承诺,然后继续运行循环的其余部分。因此,当循环完成时,promise 没有关联。我不知道您是否不需要循环继续。如果你这样做了,那么当循环完成时,promise 就没有正确连接。如果您不需要循环继续,那么您正在运行一堆不必要的代码。无论哪种方式,这都不是一个理想的设计。
标签: javascript loops promise control-flow