为什么在递归异步函数中添加then使其返回未定义状态?

时间:2019-01-30 12:38:13

标签: javascript async-await

我有一个简单的异步函数,可以很好地工作。但是我需要知道每个递归调用返回的内容,因此我添加了then(请参见行(*))。不幸的是,这样的result中的thenundefined,整个函数的结果也变成了undefined

async function foo(n) {
    try {
        if (n == 0) {
            return 0;
        }
        return n + await foo(n - 1)
            .then(result => { bar(); }); // (*)
    }
    catch (e) {
        console.log(e);
    }
}

then为什么会破坏功能?我应该再使用其他东西吗?

1 个答案:

答案 0 :(得分:2)

这就是then的工作方式-它为回调的结果创建了一个新的Promise。您的result => { bar(); }回调没有return,因此您得到undefined作为结果。你需要写

return n + await foo(n - 1).then(result => { bar(); return result; });
//                                                  ^^^^^^^^^^^^^^

但实际上您不应该将then回调混入async / await代码中。该更正后的代码等同于

const result = await foo(n - 1);
bar();
return n + await result; // (the `await` is unnecessary and should be left out)

您的原始代码可以

const result = await foo(n - 1);
bar();
return n + await undefined;