Более целесообразно использовать несколько циклов for самостоятельно или делегировать логику обещаниям? - PullRequest
0 голосов
/ 21 сентября 2018

Следующий сценарий: функция получает 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));
}) 

Какой способ более эффективен?Есть ли лучший способ сделать это?Спасибо за вашу помощь!

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

Будет ли использование обещаний более эффективным в этом случае, поскольку таким образом все циклы for могут работать одновременно?

Нет, вы неправильно поняли, что делают обещания.Это инструмент, облегчающий работу с асинхронным кодом .В вашем случае нет асинхронного кода, поэтому вы не можете использовать обещания здесь.Обещания не «делают» ничего асинхронным и даже не допускают многопоточный параллелизм.

0 голосов
/ 21 сентября 2018

Будет ли использование обещаний более эффективным в этом случае, поскольку таким образом все циклы for могут работать одновременно?

Нет, потому что обещания ничего не делаютасинхронный или параллельный.Они могут использоваться только для наблюдения вещей, которые уже асинхронны или параллельны.

Все, что будут делать броски обещаний в этом коде, это изменение, когда блокируется основной поток идобавьте накладные расходы.

Если вам нужно разгрузить или распараллелить длительные вычислительные задачи, посмотрите на веб-работников .

0 голосов
/ 21 сентября 2018

Код не будет более производительным.

JavaScript обычно является однопоточным (если вы не используете веб-работников ), поэтому ваш код не будет завершаться быстрее, используя обещания(потому что циклы не будут выполняться параллельно) - на самом деле, во всяком случае, это может быть незаметно медленнее.

Обещание - это больше способ обработки результата асинхронного кода, а не способзаставить код работать асинхронно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...