Обещание в течение, пока l oop не будет выполняться - вызывая бесконечный цикл - PullRequest
0 голосов
/ 14 марта 2020

Я пытаюсь выполнить Обещание в течение некоторого времени. L oop. Код после обещания (в .then) в конечном итоге прервет работу, пока l oop.

Однако обещание никогда не выполняется. Пока l oop просто продолжает работать бесконечно, не вызывая обещание.

Почему это так? Разве невозможно использовать обещание в течение некоторого времени l oop?

Упрощенная версия кода ниже

while(relevantRefundRequests.length >= waitList[0].quantity){

    stripe.paymentIntents.create({

    })
    .then(data => {

    ***code that will break while loop

    })

}

Ответы [ 2 ]

0 голосов
/ 14 марта 2020

Вы не можете структурировать его так, как вы это делали, потому что while() l oop будет работать вечно и никогда не позволит запустить даже первый обработчик .then() (из-за времени и причин события l oop). Таким образом, вы не можете просто сломать ваш while l oop из обработчика .then().

Если вы можете использовать async/await, то это проще:

while (relevantRefundRequests.length >= waitList[0].quantity) {

    let data = await stripe.paymentIntents.create({ ... });
    if (some condition) {
        break;
    }    
}

Имейте в виду, что содержащая здесь функция должна быть помечена async и будет возвращаться задолго до того, как будет выполнено l oop, поэтому вы должны обработать это соответствующим образом.

Если вы можете ' Если использовать async/await, то код необходимо реструктурировать, чтобы использовать управляющие структуры, отличные от while l oop, и было бы полезно увидеть реальный код (а не только псевдокод), чтобы сделать более конкретное предложение для как лучше это сделать. Общая идея такова:

function runAgain() {
    if (relevantRefundRequests.length >= waitList[0].quantity) {
        return stripe.paymentIntents.create({ ... }).then(data => {
            if (some condition to break the cycle) {
                return finalResult;
            } else {
                // run the cycle again
                return runAgain();
            }
        });
    } else {
        return Promise.resolve(finalResult);
    }
}

runAgain().then(finalResult => {
    console.log(finalResult);
}).catch(err => {
    console.log(err);
});
0 голосов
/ 14 марта 2020

Pormise является асинхронным, поэтому код в этом случае будет запущен в конце этого события l oop

...