gpt4 book ai didi

javascript - 如何在数组循环中执行 promise

转载 作者:行者123 更新时间:2023-11-30 19:18:32 25 4
gpt4 key购买 nike

我正在尝试了解如何在给定的数组循环中实现 promises 和 Promise.All 的基础知识,例如,来自 firebase 查询,它可以在循环中执行任意数量的操作,然后我可以访问到后来的结果。我似乎无法获得正确的语法 logic 。下面是一个示例方法,我想在其中延迟将一些项目插入数组,然后在循环处理后访问该数组。

我在 Stackoverfllow 上研究了不同的方法。有些人分配一个 promises = the snap.forEach 循环,然后在完成后以某种方式解决这个问题。其他人正在循环中创建一个 promise 。在下面的示例中,我只是使用 settimeout 来延迟/创建异步进程。

        testfirebaseData = () => {

let channels =[];
var promises=[];
firebase.database().ref('challengeResponses').child(day).once('value', snap => {

snap.forEach(channelChild => {

promises.push(new Promise((resolve) => {
setTimeout(() => {
channels.push(channelChild.key);
resolve(channels)
},1000)
})
)

})
}).then (() => {
Promise.all(promises).then(() => {
console.log(channels[0])
})

}


}

我希望上面的输出显示“channels”数组中的第一个元素,但它总是返回“undefined”……因为我显然没有正确处理 promise 。我错过了什么?

最佳答案

这是使用您的代码风格的示例。我用数字代替了数组中的对象;

https://jsfiddle.net/th3vecmg/4/

 var promises = [];
let channels =[];

[1, 2, 3, 4, 5].forEach((elm, i) => {

promises.push(new Promise((resolve) => {
setTimeout(() => {
channels.push(elm)
resolve(elm);
}, 1000)
}))

});
console.log(channels[0]) // gives undefined
Promise.all(promises).then(() => {
console.log(channels[0]) // gives 1
})

你不应该在 then 中得到 undefined 因为它正在等待 promise 执行。如果您试图在 then 范围之外显示结果,您只会得到 undefined

代码没有真正意义,因为您在 then 中显示一个全局变量,而不是依赖于 promise 的输出

如果你想延迟执行 1 那么在 setTimeout 的 timeArgument 中做一些乘法...

关于javascript - 如何在数组循环中执行 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57738424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com