Что происходит - в Javascript цикл обработки событий и исходный код, который вы пишете, выполняются в одном потоке. Это означает, что если этот поток заблокирован какой-либо работой, больше ничего не выполняется. Это работает довольно просто - цикл обработки событий принимает одно событие (код, который вы показываете), обрабатывает ВСЕ синхронные части и выталкивает любые асинхронные вещи (цепочку обещаний) в цикл событий, который будет выполнен позже.
Проблема заключается в следующем:
var count = 0;
while(count < 5) {
Promise.resolve()
.then(
// some promise chain...
}
while
перехватывается в бесконечном цикле, так как вся синхронная часть состоит в том, что он запускает эту цепочку Promise в цикле событий и затем запускается снова. count
никогда не изменяется в этом контексте.
Лучше всего использовать async/await
, который решает именно то, что вы хотите, без необходимости глубокого понимания Node.js
Другой вариант:использовать рекурсию
function promiseChain() {
return Promise.resolve()
.then(function () {
return new Promise(function(resolve, reject) {
console.log('func1()...');
resolve('OK');
});
})
.then(function(value) {
return new Promise(function(resolve, reject) {
console.log('func2()...');
resolve('OK');
});
})
.then(function (value) {
console.log('func3()...');
count++;
}).catch(function (error) {
console.log(error);
});
}
recursivelyExecute(promise, count) {
if (count > 5) {
return;
}
count++;
return promise.then(() => recursivelyExecute(promiseChain(), count+1));
}