在查看了许多关于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
        })
    })
})

推荐答案

您的主要问题是myOutPromArr函数是一个函数array.你想要的是一系列的promise .

以下是您的代码的修改版本(试图使其尽可能与原始代码相似),它更正确.我还花时间简化了一些代码以使用Async/AWait.

const myArr = [
  {"hello":"Bob"},
  {"hello":"Jane"},
  {"hello":"Elvis"},
  {"hello":"Zac"}
]

    
const sleep = (waitTimeInMs) => new Promise(resolve => setTimeout(resolve, waitTimeInMs));
    
async function doSleepNow(waittime, loopnum) {
  let now = new Date().toISOString();
  const inTime = "Time Start sleep for " + loopnum + " is : " + now;
  await sleep(waittime)
  
  now = new Date().toISOString();
  const outTime = "Time End sleep for " + loopnum + " is : " + now;
  const myTimeRes = "myTime = " + inTime + " : " + outTime
  return myTimeRes;
}

async function myFun1(waittime) {
  const myArrLen = myArr.length
  var myOutPromArr = [];
  
  myArr.forEach((value, index) => {
    const promise = doSleepNow(waittime, index + 1)
    myOutPromArr.push(promise)
  })
  
  return myOutPromArr;
}

myFun1(1000).then((promises) => {
    sleep(5000).then(() => {
        Promise.all(promises).then((values) => {
            console.log("promToCall outputs (myTimeRes) : ", values); // <== output_A
        })
    })
})

Javascript相关问答推荐

将未等待的未处理的错误promise 转变为警告@ changeTicksAndRejections(由当时的抛出错误创建)

类型错误:tasks.map不是函数(MERN堆栈)

不渲染具有HTML参数的React元素

在JavaScript中,是否有一种方法可以创建自定义thable,在等待某些代码后自动触发它?

在JS中获取名字和姓氏的首字母

如何将拖放功能添加到我已自定义为图像的文件输入HTML标签中?

深嵌套的ng-container元素仍然可以在Angular 布局组件中正确渲染内容吗?

了解Node.js中的EventEums和浏览器中的addEventEums之间的关系

如何解决chrome—extension代码中的错误,它会实时覆盖google—meet的面部图像?'

InDesign—创建一个独立的窗口,在文档中进行更正时保持打开状态

在观察框架中搜索CSV数据

在拖放时阻止文件打开

setcallback是什么时候放到macrotask队列上的?

在Three JS中看不到补间不透明度更改效果

如何通过使用vanilla JS限制字体大小增加或减少两次来改变字体大小

为什么我的getAsFile()方法返回空?

在SuperBase JS客户端中寻址JSON数据

在JavaScript中,有没有一种方法可以迭代字符串的词法标记?

select 2-删除js插入的项目将其保留为选项

在Java脚本中构建接口的对象