Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从已完成的循环返回数组_Javascript_Node.js - Fatal编程技术网

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 }

对于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
}

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
中做一些
加法。相同的方法有很多种,我选择了一种对我来说很容易解释的方法:)