在查看了许多关于for/Foreach循环的问题之后,我仍然不能得到Promise.all批函数的输出.
目标是同步调用doSleepNow()
的每一次迭代,但要等到所有结果都出来后再继续.then()
在下面的简化代码中,摘录output_A
应该给出四个版本的 doSleepNow().myTimeRes
,但我得到
myFun1 msg: All array for myFun1 done
promToCall outputs (myTimeRes) : [
[ [Function: promToCall] ],
[ [Function: promToCall] ],
[ [Function: promToCall] ],
[ [Function: promToCall] ]
]
让Promise.all
触发doSleepNow()
的每个循环,我错过了什么
*注意:仅将睡眠FN用作功能存根
const myArr = [
{"hello":"Bob"},
{"hello":"Jane"},
{"hello":"Elvis"},
{"hello":"Zac"}
]
var myOutPromArr = [];
const sleep = (waitTimeInMs) => new Promise(resolve => setTimeout(resolve, waitTimeInMs));
async function doSleepNow(waittime, loopnum) {
return new Promise((resolve, reject) => {
var now = new Date().toISOString();
const inTime = "Time Start sleep for " + loopnum + " is : " + now;
sleep(waittime).then(() => {
const now = new Date().toISOString();
const outTime = "Time End sleep for " + loopnum + " is : " + now;
const myTimeRes = "myTime = " + inTime + " : " + outTime
console.log("w" + inTime + " : " + outTime)
resolve(myTimeRes)
});
})
}
async function myFun1(waittime) {
return new Promise((resolve, reject) => {
const myArrLen = myArr.length
var arrCount = 0;
myArr.forEach((value) => {
arrCount++
const promToCall = (waittime, arrCount) => new Promise(resolve => doSleepNow(waittime, arrCount))
myOutPromArr.push([promToCall])
if (myArrLen === arrCount) {
resolve("All array for myFun1 done")
}
})
})
}
myFun1(1000).then((status) => {
console.log("myFun1 msg: ", status)
sleep(5000).then(() => {
Promise.all(myOutPromArr).then((values) => {
console.log("promToCall outputs (myTimeRes) : ", values); // <== output_A
})
})
})