所以我的想法是正确的,例如,当使用 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/