单独使用多个 for 循环还是将逻辑委托给 promise 的性能更高?



以下场景:一个函数获得 3 个特定长度的数组,每个数组都需要迭代以找到匹配的对象。找到对象后,for循环中断,并且不会调用下一个对象。在这种情况下,数组无法合并。基本上是这样的:

for (let i = 0; i < array1.length; i++) {
if (array1[i].id == matchingID) {
returnValue = array1[i];
break;
}
}
if (!returnValue) {
for (let i = 0; i < array2.length; i++) {
if (array2[i].id == matchingID) {
returnValue = array2[i];
break;
}
}
}
if (!returnValue) {
for (let i = 0; i < array3.length; i++) {
if (array3[i].id == matchingID) {
returnValue = array3[i];
break;
}
}
}
return returnValue;

在这种情况下,使用承诺会更有效率,因为这样所有 for 循环都可以同时工作?像这样,每个函数调用都执行上面示例中的 for 循环之一(并解析找到的值(:

return new Promise((resolve) => {
this.findMatchingIDInArray1(array1)
.then(() => resolve(returnValue));
this.findMatchingIDInArray2(array2)
.then(() => resolve(returnValue));
this.findMatchingIDInArray3(array3)
.then(() => resolve(returnValue));
}) 

哪种方式更有效?有没有更好的方法可以做到这一点?感谢您的帮助!

在这种情况下,使用承诺会更有效率,因为这样所有 for 循环都可以同时工作?

不,你误解了承诺的作用。它们是使处理异步代码更容易的工具。您的用例中没有异步代码,因此您不能在此处使用承诺。承诺不会"使"任何东西异步,甚至不会启用类似多线程的并行性。

在这种情况下,使用承诺会更有效率,因为这样所有 for 循环都可以同时工作?

不,因为承诺不会使任何异步或并行的事情。它们只能用于观察已经异步或并行的事物。

向该代码抛出承诺所做的只是在主线程阻塞时进行更改并增加开销。

如果您需要卸载或并行化长时间运行的计算任务,请查看 Web Worker 。

代码的性能不会更高。

JavaScript 通常是单线程的(除非你使用 Web Workers(,所以你的代码不会更快地使用 promise 完成(因为循环不会并行运行(——事实上,如果有的话,它可能在不知不觉中变慢了。

承诺更像是一种处理异步代码结果的方法,而不是导致代码异步运行的方法。

最新更新