Node.js asyn c .then l oop i разные значения переменной - PullRequest
0 голосов
/ 01 мая 2020

Может ли кто-нибудь помочь мне понять одну вещь в этом node.js коде

let products = productModel.getAll().then(productIds => {

    for (let i in productIds ) {

        console.log("PROD_ID:"+productIds[i]);

        alertModel.fetchAllByProductId(productIds[i]).then(alerts => {

                console.log("Alerts for PROD_ID: " + productIds[i]);
                console.log(alerts);
        });
    }
});

Как вы можете видеть здесь, я выбираю все идентификаторы продуктов, затем оповещаю об этих продуктах, в результате в консоли у меня есть

PROD_ID: 1
PROD_ID: 10
PROD_ID: 18 
Alerts for PROD_ID: 10
[...alerts data for 10 ]
Alerts for PROD_ID: 18
[...alerts data for 10 ]
Alerts for PROD_ID: 1
[...alerts data for 1 ]

Как вы видите, сначала у меня есть список всех идентификаторов продукта, причина alertModel.fetchAllByProductId - это метод asyn c, и пока первый выбор предупреждения не завершится, система результатов уже завершит l oop по всем идентификаторам продукта, но затем, когда все данные оповещения выбраны в fetchAllByProductId.then , у меня есть правильные productIds [i] , для которых выбрано это оповещение, что очень странно ...

Но, насколько я понимаю, я должен быть уже равен = 3 , и во всех обратных вызовах предупреждений у меня всегда должно быть msg как Предупреждения для PROD_ID: 18 3 раза ???

Насколько я понимаю, i , скажем, 1 переменная, которая содержит 1 слот памяти в node.js env, тогда как возможно, что во всех 3 обратных вызовах оповещения она имеет различное значение ???

Так есть ли сом Где я могу прочитать об этом? или может кто-то помочь и объяснить мне это поведение?

1 Ответ

1 голос
/ 01 мая 2020

Но, насколько я понимаю, я должен быть уже равен = 3, и во всех обратных вызовах предупреждений у меня всегда должно быть msg в качестве предупреждений для PROD_ID: 18 3 раза ???

let создает новый i для каждого вызова l oop. Итак, хотя l oop действительно выполняется до вызова любого из ваших .then() обработчиков, каждая итерация l oop имеет свое уникальное значение i. Это разница между let и var внутри for l oop. С var есть только один i, к которому относятся все итерации l oop. let и const различны.

Насколько я понимаю, я скажу 1 переменную, которая содержит 1 слот памяти в node.js env, тогда как это возможно, что во всех 3 обратных вызовах оповещения это имеет различное значение ???

let и const создать новый отдельный i для каждой итерации for l oop, чтобы ваш обработчик .then() получал ссылаться на копию i, которая принадлежит его указанной c итерации for l oop. Это упрощает асинхронный код внутри циклов следующим образом.

Вот небольшая статья о топи c: https://wesbos.com/for-of-es6

...