Javascript 在.forEach完成后执行回调函数

Javascript 在.forEach完成后执行回调函数,javascript,foreach,callback,Javascript,Foreach,Callback,我试图在forEach循环完成所有迭代之后执行一个函数 这提供了一个有趣的解决方案,但我无法让它工作 下面是我改编的代码,创建了一个简单的asyncFunction() 如图所示,脚本正确执行异步函数,但无法输入递增itemsProcessed的部分,并应触发callback()函数 我对fat arrow函数不太熟悉,所以可能是因为使用了它们 有人能解释为什么脚本没有按预期运行吗?在这种情况下,更现代的方法是使用承诺 函数异步函数(项){ //还愿 返回新承诺((解决、拒绝)=>{ 设置超时

我试图在forEach循环完成所有迭代之后执行一个函数

这提供了一个有趣的解决方案,但我无法让它工作

下面是我改编的代码,创建了一个简单的asyncFunction()

如图所示,脚本正确执行异步函数,但无法输入递增
itemsProcessed
的部分,并应触发
callback()
函数

我对fat arrow函数不太熟悉,所以可能是因为使用了它们


有人能解释为什么脚本没有按预期运行吗?

在这种情况下,更现代的方法是使用承诺

函数异步函数(项){
//还愿
返回新承诺((解决、拒绝)=>{
设置超时(()=>{
log(“在异步函数中,项为”+项)
//数据准备就绪时解析承诺
解决(项目)
},Math.random()*2000)//交错返回顺序的随机延迟
})
}
//创建一系列承诺
让promiseArray=[1,2,3].map(异步函数);
//解决所有承诺时运行
promiseArray.then(results=>{
console.log(“全部完成”)
//结果数组的顺序将与原始数组的顺序相同
console.log('结果为:',结果)
})

.as控制台包装{max height:100%!important;top:0}
将每个元素映射到一个承诺,然后使用
Promise.all()

当然,如果需要,可以在异步函数内部执行更复杂的操作

Promise.all([1, 2, 3].map(num => 
{
    return new Promise((reject, resolve) =>
    {
        setTimeout(() => resolve(num), 5000);
    })
}));

如果您正在执行的代码是同步的或涉及超时,则使用
Promise
构造函数而不是异步函数。

因为您希望将回调函数作为第二个参数传递给
asyncFunction
,您需要指定将有一个回调函数作为第二个参数,你需要这样称呼它:

function asyncFunction(item, cb) {
  console.log("in async function, item is " + item)
  cb()
}
此外,您的代码可以重写,以便更容易理解回调函数的使用。您的代码:

[1, 2, 3].forEach((item, index, array) => {
  asyncFunction(item, () => {
    itemsProcessed++;
    console.log("in callback area, itemsProcessed is " + itemsProcessed )
    if(itemsProcessed === array.length) {
      callback();
    }
  });
});
同:

[1, 2, 3].forEach((item, index, array) => {
  function cbFunc() {
    itemsProcessed++;
    console.log("in callback area, itemsProcessed is " + itemsProcessed )
    if(itemsProcessed === array.length) {
      callback();
    }
  }
  asyncFunction(item, cbFunc);
});

调用函数时,您正在将函数作为第二个参数传递给
asyncFunction()
,但函数声明不需要第二个参数,也从不调用传递给它的回调函数。谢谢。但是,我不确定第二个要声明哪个参数。显然,
异步函数(项,())
不起作用。你能更明确地解释一下如何处理第二个论点吗?查理先生,非常感谢!我从这个片段中学到了一些东西,并继续我的任务。在这个虚拟的世界里,我们不能见面握手。愿我的善缘保佑你。
[1, 2, 3].forEach((item, index, array) => {
  asyncFunction(item, () => {
    itemsProcessed++;
    console.log("in callback area, itemsProcessed is " + itemsProcessed )
    if(itemsProcessed === array.length) {
      callback();
    }
  });
});
[1, 2, 3].forEach((item, index, array) => {
  function cbFunc() {
    itemsProcessed++;
    console.log("in callback area, itemsProcessed is " + itemsProcessed )
    if(itemsProcessed === array.length) {
      callback();
    }
  }
  asyncFunction(item, cbFunc);
});