我对promise很困惑。所有,我都有很多这样的方法:
const push = async () => {
for (var i = 0; i < 2000; i++) {
return new Promise(invoke => {
client.publish(topic, message, pushOptions); // is mqtt client
invoke(true);
});
}
};
const example2 = async () => {
console.log('example2 started');
await push();
await push();
await push();
await push();
await push();
}; ....
现在,我想通过全部承诺运行所有方法:
var syncList = [];
syncList.push(
example2, example3, example4);
Promise.all(syncList)
.then((result) => {
console.log(result);
}).catch(err => {
console.log(err);
});
但是没有方法启动,我在终端上得到了这个登录信息:
[ [AsyncFunction: example2],
[AsyncFunction: example3],
[AsyncFunction: example4] ]
为什么我的方法没有运行?
答案 0 :(得分:0)
您的问题是,您立即return
{strong>第一承诺。您的push
函数仅返回一个Promise。
在下面的示例中,我们有一个函数返回一个未解决的承诺数组。 Promise.all()
const getPromiseArray = () => {
console.log('start collecting tasks');
const allPromises = [];
for (var i = 0; i < 10; i++) {
const newTask = new Promise(function(invoke) {
const taskNr = i;
setTimeout(() => { // some long operation
console.log("task " + taskNr);
invoke();
}, 400);
});
allPromises.push(newTask);
}
console.log('end collecting tasks\n');
return allPromises;
};
(async () => {
const promisesArray = getPromiseArray();
await Promise.all(promisesArray);
})();
答案 1 :(得分:0)
Promise.all
得到一个Promise
数组,但是传递给它的不是Promise
,而是一些异步函数声明。
将它们传递给Promise.all
时应运行这些函数。
与此等效的东西:
Promise.all([example2(), example3(), example4()])
当然,您的push
函数似乎也是错误的!其循环仅针对i=0
运行,因为它在循环迭代其他i
值之前返回。