javascript - 带 Promises 的递归意味着注册的回调被调用多次

标签 javascript node.js recursion promise es6-promise

所以我的想法是正确的,例如,当使用 Promise 进行递归时,无论递归多少次,我们最终都会调用所有链式回调

function p() {
    return new Promise(function (r) {
        process.nextTick(r);
    })
}


function recurse(count) {

    return p().then(function () {
        if (count < 10) {
            console.log('count => ', count);
            return recurse(++count);
        }
    }).then(function(){
        console.log('a');
        return 5;
    });

}


recurse(1).then(function () {
    console.log('done');
});

如果你运行上面的代码,我们会得到:

count =>  1
count =>  2
count =>  3
count =>  4
count =>  5
count =>  6
count =>  7
count =>  8
count =>  9
a
a
a
a
a
a
a
a
a
a
done

有没有办法只用 console.log('a') 注册一次这个回调,而不是注册 10 次?

我不认为我想要/需要这个函数被调用 10 次,并且想找到一种方法让它只被调用一次。

实际上,我对 Observables 的类似解决方案同样感兴趣,特别是 RxJS5 Observables。

最佳答案

我想唯一的解决方案是将代码的其余部分嵌套在第一个 promise 回调中,如下所示:

function p() {
    return new Promise(function (r) {
        process.nextTick(r);
    })
}


function recurse(count) {
    return p().then(function () {
        if (count < 10) {
            return recurse(++count);
        } else {
            // all your remaining code would have to go here
            console.log('a');
            return 5; // or return someOtherPromise() or anything
        }
    });
}

recurse(1).then(function () {
    console.log('done');
});

关于javascript - 带 Promises 的递归意味着注册的回调被调用多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41413308/

相关文章:

javascript - 如何让 Screeps 找到资源?

javascript - Jquery ui 选项卡仅在单击时加载 iframe

html - 更改node.js html-pdf npm模块中toStream()的文件名

node.js - Nodejs 的 Nodejitsu 托管详细信息是什么

检查一个数字是否包含一对都是质数的组合

javascript - "a.getFullYear is not a function"尝试获取日期差异时

javascript - Angularjs - 使用 $scope 值加载 JSON 数据(动态)返回未定义

node.js - 将 HLS .m3u8 文件及其段文件 .ts 存储在 cassandra 数据库中是否很好?

powershell - 递归 PowerShell 函数无法调用自身

c - 没有循环的递归冒泡排序