javascript - 如何从完成的循环中返回数组

标签 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
}

console.log(foo([1,2,3,4]))
console.log("Done")

结果:

[]
Done

除了输出:

[ 3, 4, 5, 6 ]
Done

任何人都可以帮助我,或者向我解释 javascript 中的异步来解决这个问题。

最佳答案

尝试跟随

function foo(items) {
 var result = []
 // Assume under forEach statement take 2 sec per loop
 items.forEach(function(item) {
    // Create a promise for each async function
    var promise = new Promise(function(resolve, reject) {
       setTimeout(function() {
           resolve(item + 2); // resolve the async function
       }, 2000);
     });
     result.push(promise); // push the promise into array
  }); 
  // Create one promise for all the promises and return
  return Promise.all(result) 
}
// Now, foo function returns a promise and then is called once the promise is resolved which contains the data
foo([1,2,3,4]).then((response) => console.log(response)).then(() => console.log("Done"));

因为 setTimeout 是一个 ansync 函数,即它是乱序执行的,因此,正如预期的那样,输出是一个空数组(当返回数组时,没有执行 setTimeout 函数的回调)。您可以使用 Promises用于使用异步函数。

关于javascript - 如何从完成的循环中返回数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50374971/

相关文章:

javascript - 选择数组javascript的一部分

javascript - 从 javascript/Nodejs 中未知大小的字节流中解码前置的 VarInt

javascript - 如何使用 Node.js 连接到 FTPS?

javascript - 同步 2 HTML 输入范围和数量

javascript - 使用 jQuery 通过动态 HTML 输入字段将商品总数量计算为商品价格

javascript - Ajax 请求似乎在 IE 8 中失败

javascript - Bluebird Promise.all 没有被调用

javascript - 平均JS : MissingSchemaError when runnig server

node.js - 如何修复 Windows 10 中的 "npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142"错误?

javascript - 如何在 Node.js 中添加 promise.all Sequelize findOrCreate 循环?