javascript - Är det mer effektivt att använda flera for-loopar själva eller att delegera logiken till promises?
Följande scenario: En funktion får 3 arrayer av en viss längd, var och en av dessa behöver itereras över för att hitta ett matchande objekt. När objektet hittas, bryts for-loopen och nästa anropas inte. Arrayerna kan inte slås ihop i detta fall. I princip så här:
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;
Skulle det vara mer effektivt att använda promises i det här fallet, eftersom på det sättet kan alla for-loopar köras samtidigt? På detta sätt, med varje funktionsanrop som gör en av for-looparna (och löser det hittade värdet) från exemplet ovan:
return new Promise((resolve) => {
this.findMatchingIDInArray1(array1)
.then(() => resolve(returnValue));
this.findMatchingIDInArray2(array2)
.then(() => resolve(returnValue));
this.findMatchingIDInArray3(array3)
.then(() => resolve(returnValue));
})
Vilket sätt är mer presterande? Finns det ett bättre sätt att göra detta? Tack för din hjälp!
Svar #1
Skulle det vara mer effektivt att använda löften i det här fallet, eftersom alla for-loopar på så sätt kan köras samtidigt?
Nej, du missförstod vad löften gör. De är ett verktyg för att göra hantering av asynkron kod enklare. Det finns ingen asynkron kod i ditt användningsfall, så du kan inte använda löften här. Löften gör inget asynkront, eller ens möjliggör parallellism liknande multitrådning.
Svar #2
Skulle det vara mer effektivt att använda löften i det här fallet, eftersom alla for-loopar på så sätt kan köras samtidigt?
Nej, eftersom löften inte gör något asynkront eller parallellt. De kan endast användas för att observera saker som redan är asynkrona eller parallella.
Allt det där med att kasta löften på den koden skulle bara ändra när huvudtråden blockerar och lägga till överbelastning.
Om du behöver avlasta eller parallellisera långvariga beräkningsuppgifter, titta på webbarbetare.