Как ожидать рекурсивного вызова метода в JavaScript - PullRequest
0 голосов
/ 22 сентября 2019

Я пытаюсь дождаться рекурсивного вызова метода в javascript.Это мой код для запуска рекурсивного метода:

(async function start() {
    await writeText(htmlEditor, 0, time, '#editor');
    await writeText(fileSystem, 0, time, '#fileSystem');
    await console.log("Hello World");
}).call(this);

Это рекурсивный метод:

function writeText(message, index, interval, to) {
    return new Promise(resolve => {
        let pre;
        if (index < message.length) {
            pre = document.getElementById('editor');
            pre.scrollTop = pre.scrollHeight;
            writeChar(message[index++], to);
            setTimeout( function () {
                writeText(message, index, interval, to);
            }, time);
        }
    })

}

Однако, когда я использую этот код, все методы в функции запуска вызываютсяв то же время.Я подозреваю, что это из-за рекурсивного вызова в функции writeText.

Как я могу ждать завершения всего рекурсивного стека?

1 Ответ

2 голосов
/ 22 сентября 2019

Ваша функция writeText не выполняет никаких действий, чтобы дать потребителю возможность зацепиться за фактическое выполнение.setTimeout используется здесь для выполнения некоего типа «запускай и забывай».

Попробуйте заставить его вернуть обещание, которое разрешается, когда работа фактически выполняется:

function writeText(message, index, interval, to) {

    let pre;
    if (index < message.length) {
        pre = document.getElementById('editor');
        pre.scrollTop = pre.scrollHeight;
        writeChar(message[index++], to);
        // wrap the setTimeout in a promise and proxy the result of the recursive call
        return new Promise((resolve, reject) => {
            setTimeout( function () {
                writeText(message, index, interval, to).then(resolve, reject);
            }, time);
        });
    }
    // "base case" I guess, return undefined
    return Promise.resolve();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...