Остановить выполнение цикла, пока асинхронная функция не будет вызвана - PullRequest
0 голосов
/ 18 июня 2019

Я использую каркас Expressjs и пытаюсь отправлять текстовые сообщения в массив чисел textMessageNumbers, используя пакет request.

for(let i = 0; i < textMessageNumbers.length; i++) {
    request('https://LINK_TO_API?destination=' + textMessageNumbers[i] + '&q=' + api + '&message=' + textMessage, { json: true }, function(err, res, body) {
        if(err) {
            res.write("<br><div class='alert alert-warning'>Error occurred while sending text message to " + textMessageNumbers[i] + "</div>")
            callback()
        }

        if(res.body == 0) {
            res.write("<br><div class='alert alert-success'> Text message sent successfully to <b>" + textMessageNumbers[i] + "</b></div>")
            callback()
        } else {
            res.write("<br><div class='alert alert-warning'> Couldn't send message to <b>" + textMessageNumbers[i] + "</b></div>")
            callback()
        }
    })
}

res.write("<br><div class='alert alert-success'> Delivery Note Successfull</div>")
res.end()
return

Поскольку вызов функции запроса асинхронный, цикл for будетпродолжить выполнение, даже если обратные вызовы не вызываются.Как только цикл for завершит выполнение, вызов res.end() закроет объект ответа, тем самым сделав невозможным выполнение вызовов res.write() внутри обратных вызовов.Как я могу заставить каждую итерацию цикла ждать, пока обратный вызов не будет завершен, чтобы объект ответа закрывался только после того, как все асинхронные вызовы функции запроса были вызваны обратно.

...