我正在尝试通过使用promise和while(JavaScript / Node.js)依次重复执行多个进程。 但是,未执行promise函数(即,从不显示所有console.log())。
为什么promise函数不会在一段时间内执行?
另外,如何依次重复显示一些console.log()?
$data
我正在尝试通过使用promise和while(JavaScript / Node.js)依次重复执行多个进程。 但是,未执行promise函数(即,从不显示所有console.log())。
为什么promise函数不会在一段时间内执行?
另外,如何依次重复显示一些console.log()?
$data
.then()
仍然是异步回调,请在此处查看消息顺序:
Promise.resolve().then(()=>console.log("got resolved"));
console.log("got here");
您可以做的一件事是将代码包装到async function
中:
async function test(){
var count = 0;
while(count < 5) {
await 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);
});
}
}
test();
,
发生了什么-用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));
}
,
var count = 0;
while(count < 5) {
Promise.resolve()
.then(function () {
return new Promise(function(resolve,reject) {
console.log('func2()...');
resolve('OK');
});
})
.then(function (value) {
console.log('func3()...');
}).catch(function (error) {
console.log(error);
});
count++;
}
,
您需要将Promise.all()
和async.eachSeries
一起使用来进行循环。为此,您需要安装async,然后执行以下操作:
const async = require('async');
var count = [...Array(5).keys()];
async.eachSeries(count,(c,next) => {
Promise.all([
new Promise(function (resolve,reject) {
console.log('func1()...');
resolve('OK');
}),new Promise(function (resolve,reject) {
console.log('func2()...');
resolve('OK');
})]).then(function (values) {
console.log('func3()...');
next();
});
},(err) => {
console.log("here we done");
});