【问题标题】:Recursive function doesn't work within Promise递归函数在 Promise 中不起作用
【发布时间】:2020-07-20 02:05:18
【问题描述】:

我有一个函数,其中嵌套了 Promises。当长度值为streamRes.length 时,我想重新执行此函数。目前只执行代码并在控制台打印出长度,不会重新执行。

let fetchEnrolleesData = () => {
    getLastUpdatedEnrollee().then(res => {
        let params = path+"enrollees?limit=100";
        params += res.last_date ? "&last_updated_at=" + res.last_date.value : '';

        fetchEnrolleesDataInStream(res, params).then(streamRes => {
            if(streamRes.length) {
                console.log(streamRes.length);
                fetchEnrolleesData();
            }
        });
    });
}

【问题讨论】:

  • 你没有返回getLastUpdatedEnrollee返回的承诺,也没有返回getLastUpdatedEnrollee的承诺。
  • "但不会重新执行。":是的(即使您没有返回承诺),但不知道代码中的其他函数,以及你如何使用这个函数的主调用,我们不能真正说出为什么它的行为不像你期望的那样。在代码中添加更多console.log 调用,以查看例如length 何时为0,何时执行任何then 调用,...等等

标签: javascript promise


【解决方案1】:

作为evolutionxboxwrote,你需要返回getLastUpdatedEnrollee返回的promise以及getLastUpdatedEnrollee本身的promise。通常,在函数内调用 promise 时,您需要返回这些 promise 才能在函数外使用这些值。

这是您根据需要添加了return 的代码:

let fetchEnrolleesData = () => {
    return getLastUpdatedEnrollee().then(res => {
        let params = path+"enrollees?limit=100";
        params += res.last_date ? "&last_updated_at=" + res.last_date.value : '';

        return fetchEnrolleesDataInStream(res, params).then(streamRes => {
            if(streamRes.length) {
                console.log(streamRes.length);
                return fetchEnrolleesData();
            }
        });
    });
}

作为可选的附注,您可能更喜欢使用() => … 语法而不是() => { … },以消除在顶级函数中编写return 的需要。您可以在顶级函数中执行此操作,因为它没有其他语句;这在具有多个语句的内部函数中不起作用。详情请参阅arrow function expressions

let fetchEnrolleesData = () =>
    getLastUpdatedEnrollee().then(res => {
        // …
    });

【讨论】:

    猜你喜欢
    • 2021-10-28
    • 1970-01-01
    • 2018-07-14
    • 2020-07-26
    • 2018-04-19
    • 2018-04-02
    • 2014-04-03
    • 1970-01-01
    相关资源
    最近更新 更多