Promise.all.then并非所有代码路径都返回值

时间:2018-12-29 13:26:26

标签: javascript typescript promise async-await es6-promise

我要返回以下功能 Promise <数字[]>

async fetchCommentLines(commitDict: CommitDict): Promise < number[] > {
    if (GitCommentService.isLoggedIn()) {
        const commentLines = Object.values(commitDict).map(async commit => {
            // ...
            // do the job and return number[]
            // ...
            return lineNums;
        });

        Promise.all(commentLines)
            .then(commitLines => {
                return Array.prototype.concat.apply([], commitLines);
            });
    } else {
        return [] as number[];
    }
}

首先,我得到“函数缺少结尾的return语句,并且返回类型不包含'undefined'”

然后我添加了 undefined (因此返回类型变为 Promise

但是我得到“这次并非所有代码路径都返回一个值”

似乎我没有考虑以下代码的可能路径

Promise.all(...)
.then(val => {return ...})

我缺少什么?

我也尝试过

Promise.all(...)
.then(val => {return ...})
.catch(e => {return ...})

但这没有帮助

注意:我的主要目的是返回 Promise <数字[]> ,而不是 Promise <数字[] |未定义>

2 个答案:

答案 0 :(得分:2)

您应该返回Promise

return Promise.all(commentLines).then(...)
//....

或等待诺言并返回结果对象

let lines = await Promise.all(commentLines)
return [].concat(...lines)

答案 1 :(得分:1)

您的Promise.all分支永远不会发出return (value)语句。 then回调确实起作用,但then回调之外的代码则没有。

您可能想要return的结果Promise.all().then()

    return Promise.all(commentLines)
//  ^^^^^^
        .then(commitLines => {
            return Array.prototype.concat.apply([], commitLines);
        });