Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.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_Asynchronous_Promise_Async Await_Reduce - Fatal编程技术网

在javascript中使用承诺运行代码时出现问题

在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

程序描述

我的解决办法是

目前的情况是: funcC[[aa,bbb,tyui],[ccc],[dfghj,aedtfr]]。thenx=>console.logx

结果是: [反对承诺]11

有什么问题吗?

[修复了答案]

你应该等待a,而不是到处等待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;
}