Вы никогда не захотите "спать" с таким циклом ожидания-ожидания. Это означает, что больше ничего нельзя сделать в главном потоке.
После запуска операций, которые представляют обещания, если они не предоставляют каких-либо пользовательских средств их приостановки, вы не можете их приостановить. Помните, что обещания на самом деле ничего не делают ;они обеспечивают стандартный способ наблюдать что-то делается.
Другая проблема с этим кодом заключается в том, что вы возвращаете offers
, а не результаты вызова getExtendedInfo
.
Если проблема вызывается getExtendedInfo
слишком часто, вы можете вставить задержку (используя setTimeout
, а не занятый цикл). Например, это делает первый запрос к getExtendedInfo
почти сразу, следующий через одну секунду, следующий через две секунды и так далее:
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
function executeWithDelay(offers) {
return Promise.all(
offers.map((offer, i) =>
sleep(i * 1000).then(getDetailedInfo)
)
});
}
Очевидно, что вы можете отрегулировать эту задержку по мере необходимости.
(Обратите внимание, что executeWithDelay
не объявлено async
; в этом нет необходимости, поскольку в любом случае необходимо использовать Promise.all
.)