NodeJS - ожидание возврата внутри setTimeout - PullRequest
0 голосов
/ 09 декабря 2018

Я пытаюсь научиться асинхронно / жду.Я хочу дождаться возврата в моей асинхронной функции.Мне нужно вызывать его несколько раз, поэтому я использовал setTiemout внутри.

EDIT:

//Processing gallery
async function somefunction(){
    async function getPictureR(){

        /* some code */

        if($('.actions > .prev', html)[0]){
            older = $('.actions > .prev', html)[0].attribs.href;
        } else {
            console.log('return');
            return;
        }

        /* some code */

        return new Promise((resolve, reject) => {
            setTimeout(getPictureR, 1 * 1000/2);    
        })
    }
    await getPictureR();
    console.log('getPictureR done');
}

Я пробовал await getPictureR(), но он срабатывает сразу после первого вызова функции.Как я могу ждать этого возвращения?

1 Ответ

0 голосов
/ 09 декабря 2018

Никогда не следует вызывать функцию, возвращающую обещание, например getPictureR, из асинхронного (не обещающего) обратного вызова или внутри конструктора new Promise .Вы также никогда не решали new Promise.Вы ищете

return new Promise((resolve, reject) => {
    setTimeout(resolve, 1 * 1000/2);    
}).then(() => {
    return getPictureR(); // do the promise call in a `then` callback to properly chain it
})

Но так как вы используете async / await, вам не нужна рекурсивная функция и цепочка then в любом случае.Также вы можете выделить обертку setTimeout в обещании в отдельной вспомогательной функции:

function delay(t) {
    return new Promise(resolve => setTimeout(resolve, t));
}
async function somefunction() {
    while (true)
        /* some code */

        const prev = $('.actions > .prev', html);
        if (prev.length) {
            older = prev[0].attribs.href;
        } else {
            console.log('return');
            break;
        }

        /* some code */

        await delay(1 * 1000/2);
//      ^^^^^^^^^^^
    }
    console.log('getPicture done');
}
...