Узел Асинхронная / ожидающая рекурсивная функция завершает выполнение кода - PullRequest
0 голосов
/ 06 ноября 2019

У меня проблема с Node Async Await и рекурсивными функциями. По какой-то причине выполнение кода прекращается после разрешения Promise для рекурсивной функции. Ниже приведен простой пример, который я привел для демонстрации своей проблемы (хотя обнаружил проблему при отправке некоторых запросов с библиотекой запросов).

Если вы запустите код, вы увидите

Starting
Inside Promise

, но не "Тест завершен".

function promiseFunc(number) {
    return new Promise((resolve, reject) => {
        if (number == 100) {
            console.log('Inside Promise');
            resolve('Done');
        } else {
            number += 1
            promiseFunc(number);
        }
    })
}


(async function testFunc() {
    console.log('Starting');
    await promiseFunc(0)
    console.log("Test completed");
})()

Может кто-нибудь сообщить, в чем проблема?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Вот несколько способов исправить это:

function promiseFunc(number) {
    return new Promise((resolve, reject) => {
        if (number == 100) {
            console.log('Inside Promise');
            resolve('Done');
        } else {
            number += 1;
            resolve(promiseFunc(number));
        }
    })
}


(async function testFunc() {
    console.log('Starting');
    await promiseFunc(0)
    console.log("Test completed");
})()

Или, что интересно, эквивалентный код, который использует async / await вместо явного new Promise(...), работает для вашего случая:

// an async function returns a Promise
async function promiseFunc(number) {
        if (number == 100) {
            console.log('Inside Promise');
            return 'Done';
        } else {
            number += 1;
            // it seems to work as intended without saying return promiseFunc(...)
            promiseFunc(number);
        }
    }


(async function testFunc() {
    console.log('Starting');
    await promiseFunc(0)
    console.log("Test completed");
})()
0 голосов
/ 06 ноября 2019

Вы должны сделать так

  function promiseFunc(number) {
    return new Promise((resolve, reject) => {
        http.post('/api')
        .then((data) => {
            resolve(data);
        })
    })
}

    (async function testFunc() {
    console.log('Starting');
    const result = [];
    for (let index = 0; index < 100; index++) {
        result[index] = await promiseFunc(0);
    }
    console.log("Test completed");
})()
...