Вложенный l oop Синхронный или Асинхронный? - PullRequest
0 голосов
/ 16 января 2020

У меня есть массив с именем noNCreatedResources. Я хочу выполнить некоторые операции с каждым элементом массива и элементом pu sh в массиве createdResources, удалить элемент из массива noNCreatedResources и продолжать делать это до тех пор, пока noNCreatedResources не станет пустым. Для этого я написал CreateResources функцию, включая вложенные while и для l oop. Это работает нормально, но я понимаю, что это не работает синхронно. Например: он должен повторяться дважды, пока l oop, но повторяется 4 раза, и я не знаю почему. Я думаю, что не понимаю концепцию асинхронного / ожидающего / неблокирующего node.js. Может ли тело помочь мне понять, в чем проблема?

CreateResources = async () => {
  while (this.noNCreatedResources.length > 0) {
    for (let index = 0; index < this.noNCreatedResources.length; index++) {
      if (this.resourceHasCreatedDependencies(this.noNCreatedResources[index])) {
        const resourceModel = this.someOperation(this.noNCreatedResources[index]);
        this.createdResources.push(resourceModel);
        this.noNCreatedResources.splice(index, 1);
      }
    }
  }
}

Ответы [ 2 ]

1 голос
/ 16 января 2020

Прежде всего, вы не делаете ничего асинхронного в своей функции, поэтому вы можете удалить ключевое слово async из своей функции. Поскольку вы не делаете ничего асинхронного, ваша проблема не связана с этим. Это скорее проблема реализации IMO.

Ваш while l oop бесполезен для того, чего вы пытаетесь достичь. Кроме того, ваша логика c не работает!

Пример: Следующий код выведет 1, 3 и 5.

let x = [1,2,3,4,5];
for(let i = 0; i < x.length; i++) {
  console.log(x[i]);
  x.splice(i, 1);
}

Я не думаю, что вам нужно удалить элемент из массива, чтобы достичь ожидаемого результата. Если вам нужно сбросить массив, то в конце вы можете просто сделать это x = [], чтобы сбросить массив.

0 голосов
/ 16 января 2020

Проблема не в асин c вызовах. На самом деле, ваш код полностью синхронен. Попробуйте взглянуть на то, где был создан / обновлен noNCreatedResources. Асин c вызовы происходят, когда вы отправляете http-запрос, читаете файл и т. Д. c, другими словами, операции, которые не происходят внутри вашего кода. Он позволяет коду go вкл, не блокируя следующие вызовы функций, и когда обещание выполнено, вызывается функция обратного вызова.

...