Javascript 如何从已完成的循环返回数组
对于javascript世界,我有一个简单的方法Javascript 如何从已完成的循环返回数组,javascript,node.js,Javascript,Node.js,对于javascript世界,我有一个简单的方法 function foo(items) { var result = [] // Assume under forEach statement take 2 sec per loop items.forEach(function(item) { setTimeout(function() { result.push(item + 2) }, 2000) }) return result }
function foo(items) {
var result = []
// Assume under forEach statement take 2 sec per loop
items.forEach(function(item) {
setTimeout(function() {
result.push(item + 2)
}, 2000)
})
return result
}
console.log(foo([1,2,3,4]))
console.log("Done")
结果:
[]
Done
[ 3, 4, 5, 6 ]
Done
输出除外:
[]
Done
[ 3, 4, 5, 6 ]
Done
任何人都可以帮助我,或者向我解释用javascript实现异步来解决这个问题 摆脱
setTimeout
后,它应该可以正常工作:
function foo(items) {
var result = []
// Assume under forEach statement take 2 sec per loop
items.forEach(function(item) {
result.push(item+2)
})
return result
}
console.log(foo([1,2,3,4]))
console.log("Done")
返回[3,4,5,6]
尝试以下操作
函数foo(项目){
var结果=[]
//假设在forEach语句下,每个循环花费2秒
items.forEach(功能(项目){
//为每个异步函数创建承诺
var承诺=新承诺(功能(解决、拒绝){
setTimeout(函数(){
解析(项+2);//解析异步函数
}, 2000);
});
result.push(promise);//将promise推入数组
});
//为所有承诺创建一个承诺并回报
返回承诺。全部(结果)
}
//现在,foo函数返回一个promise,然后在解析包含数据的promise后调用它
foo([1,2,3,4]),然后((响应)=>console.log(响应)),然后(()=>console.log(“完成”)代码>代码:
使用Array.map
将元素推入:
函数foo(项目){
var结果=[]
items.map(=>result.push(2))
返回结果
}
这是因为设置超时
。您正在将异步代码放入同步循环中。你能摆脱超时吗?为什么你需要设置超时?如果您确实需要它,请检查链接问题。它详细解释了如何在javascript中处理异步。@YuryTarabanko@MaxBaldwin实际上,在循环中,在将项推入结果之前需要一些时间,例如查询或需要时间的事情。@6LYTH3那么您确实需要检查链接的问题:)并使用.map
或.reduce
方法,如果您只想返回数组。真的吗<代码>映射
以推送到外部阵列。为什么??:)@尤里塔拉班科:编辑以添加。还有为什么要投反对票?事实上,我没有投反对票:)但我同意反对票:推广map
做副作用是个坏主意。付出了巨大的努力!使用.map
对我有好处,foo([1,2,3,4])。然后((响应)=>console.log(响应))。然后(()=>console.log(“完成”)
@6LYTH3-同意。更新。谢谢。@MaxBaldwin-这个想法是为了理解async
函数,而不是在timeout
中做一些加法。相同的方法有很多种,我选择了一种对我来说很容易解释的方法:)