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