在javascript中使用承诺运行代码时出现问题
程序描述 我的解决办法是 目前的情况是: funcC[[aa,bbb,tyui],[ccc],[dfghj,aedtfr]]。thenx=>console.logx 结果是: [反对承诺]11 有什么问题吗?[修复了答案] 你应该等待a,而不是到处等待a在javascript中使用承诺运行代码时出现问题,javascript,asynchronous,promise,async-await,reduce,Javascript,Asynchronous,Promise,Async Await,Reduce,程序描述 我的解决办法是 目前的情况是: funcC[[aa,bbb,tyui],[ccc],[dfghj,aedtfr]]。thenx=>console.logx 结果是: [反对承诺]11 有什么问题吗?[修复了答案] 你应该等待a,而不是到处等待a function funcC(arr) { return new Promise(resolve => { let isFirst = true //a
function funcC(arr)
{
return new Promise(resolve =>
{
let isFirst = true
//a <=> total
let total = arr.reduce(async (a,b) =>
{
if(isFirst) {
isFirst = false
return (await funcB(await a) + await funcB(b))
}
else {//a <=> total
return (await a + await funcB(b))
}
})
resolve(total)
})
}
这真是令人费解 不要将业务逻辑放在setTimeout回调中。只解决承诺,然后在承诺中完成工作,然后回调或等待。 始终传递一个初始值以减少!这将使它能够与空数组一起工作,并且它将消除对真正奇怪的isFirst逻辑的需要。 总数已经是一个承诺。不要不必要地用新的承诺来包装它! 这些建议将导致
function funcA(s) { return s.length }
function funcB(arr) {
return new Promise(resolve => {
setTimeout(resolve, 2000);
}).then(() => {
let total = 0;
arr.forEach(element => {
total += funcA(element)
});
return total;
});
}
function funcC(arr) {
return arr.reduce(async (a,b) => {
return await a + await funcB(b)
}, Promise.resolve(0))
}
然而。您更应该在funcC中使用循环方法,并在funcB中使用reduce,因为它更适合:
async function funcB(arr) {
await new Promise(resolve => {
setTimeout(resolve, 2000);
});
return arr.reduce((total, element) => total + funcA(element), 0);
}
async function funcC(arr) {
let total = 0;
for (const b of arr) {
total += funcB(b);
}
return total;
}
好的,发现问题,你应该等待a而不是每个地方。我评估了它,得到了一个结果,只添加了两个等待。非常感谢。我不知道会有什么问题。您如何解释您对“等待a”的更改?我怎样才能投票支持你的正确答案呢?异步函数总是返回一个承诺,reduce中的这个承诺也是如此。累加器a仍然是上一次迭代的结果,但由于reduce中的异步,它是一个承诺。不知道如何投票给正确的答案:我的想法与上一次迭代的“a”方向相同。你的解释很充分。再次非常感谢。我在你的回答下面点击了V谢谢。我需要时间深入了解材料以理解这一点
function funcA(s) { return s.length }
function funcB(arr) {
return new Promise(resolve => {
setTimeout(resolve, 2000);
}).then(() => {
let total = 0;
arr.forEach(element => {
total += funcA(element)
});
return total;
});
}
function funcC(arr) {
return arr.reduce(async (a,b) => {
return await a + await funcB(b)
}, Promise.resolve(0))
}
async function funcB(arr) {
await new Promise(resolve => {
setTimeout(resolve, 2000);
});
return arr.reduce((total, element) => total + funcA(element), 0);
}
async function funcC(arr) {
let total = 0;
for (const b of arr) {
total += funcB(b);
}
return total;
}