Запуск asyn c map в NodeJS - PullRequest
1 голос
/ 16 июня 2020

Я пытаюсь запустить asyn c map на моем NodeJS сервере, но он не ожидает, что карта завершит sh.

let test = `Start`;

    const array1 = ['A', 'B'];
    array1.map( async (arr1) => {
        test += ' ' + arr1;

        // Just a async request for testing. Return a name
        const pData = await property.getPropTotalUnitsByCompany(73);
        pData.map( (propData) => {
            test += ' ' + propData.PropertyName;
        });
    });

    console.log(test);

Вывод консоли: «Start AB ". Он никогда не получает данные из property.getPropTotalUnitsByCompany.

getPropTotalUnitsByCompany возвращает массив с парой имен свойств. Похоже, что код не ждет обработки запроса asyn c.

Ответы [ 2 ]

1 голос
/ 16 июня 2020

Вы правы, что, как написано, это не будет ждать завершения асинхронных c функций. Вы можете сделать так, чтобы ваши asyn c функции возвращали обещание, а затем вызывали Promise.all для результата функции карты, например:

let test = `Start`;

const array1 = ['A', 'B'];

const promises = array1.map( async (arr1) => {
    test += ' ' + arr1;

    // Just a async request for testing. Return a name
    return property.getPropTotalUnitsByCompany(73).then(pData => {
        pData.map((propData) => {
            test += ' ' + propData.PropertyName;
        });
    });
});

await Promise.all(promises);

console.log(test);
0 голосов
/ 16 июня 2020

Ваше предположение было правильным, ваш код не ждет выполнения обещаний. Поскольку вы на самом деле не mapping что-то (вы ничего не возвращаете из своего map и скорее нажимаете на переменную test), это можно упростить, используя простой for .. of:

for (const element of array1) {
    test += ' ' + element;

    // Just a async request for testing. Return a name
    const pData = await property.getPropTotalUnitsByCompany(73);
    pData.forEach((propData) => {
        test += ' ' + propData.PropertyName;
    });
}

Вот немного адаптированная версия вашего кода:

const someAsyncFunc = () => new Promise(resolve => setTimeout(() => resolve(["x", "y"]), 10));

(async () => {
    let test = `Start`;

    const array1 = ['A', 'B'];
    for (const element of array1) {
        test += ' ' + element;

        // Just a async request for testing. Return a name
        const pData = await someAsyncFunc();
        pData.forEach((propData) => {
            test += ' ' + propData;
        });
    }

    console.log(test); // prints "Start A x y B x y"
})()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...