【发布时间】:2017-06-26 22:03:00
【问题描述】:
来自 Promise 世界,我可以实现一个队列函数,该函数返回一个 Promise,在前一个 Promise 解决之前不会执行。
var promise = Promise.resolve();
var i = 0;
function promiseQueue() {
return promise = promise.then(() => {
return Promise.resolve(++i);
});
}
promiseQueue().then(result => {
console.log(result); // 1
});
promiseQueue().then(result => {
console.log(result); // 2
});
promiseQueue().then(result => {
console.log(result); // 3
});
// -> 1, 2, 3
我正在尝试使用 Observables 重新创建这个类似队列的函数。
var obs = Rx.Observable.of(undefined);
var j = 0;
function obsQueue() {
return obs = obs.flatMap(() => {
return Rx.Observable.of(++j);
});
}
obsQueue().subscribe(result => {
console.log(result); // 1
});
obsQueue().subscribe(result => {
console.log(result); // 3
});
obsQueue().subscribe(result => {
console.log(result); // 6
});
// -> 1, 3, 6
每次订阅时,它都会重新执行 Observable 的历史记录,因为在订阅时,“当前 Observable”实际上是一个发出多个值的 Observable,而不是等待直到最后一次执行的 Promise完成。
flatMap 不是这个用例的答案,我可以在网上找到的几乎所有“链”和“队列”答案都是关于链接多个 Observable,它们是一个整体 Observable 的一部分,其中 flatMap 是正确答案。
如何使用 Observables 创建上述 Promise 队列函数?
就上下文而言,此队列功能正在对话服务中使用,它规定一次只能显示一个对话。如果多次调用以显示不同的对话框,则它们一次只会按调用顺序出现一个。
【问题讨论】:
-
所以你想每次都从 observable 中取出下一项?你试过
.take(1)吗? -
我想等到
complete()被前一个 Observable 的观察者调用后再创建一个新的观察者。我玩过finally(),但还没有找到让它工作的方法。 -
如果你寻求一个特定的顺序,应该使用 concatMap。内部值可以使用在通知应该调用下一个通知时发出的主题
标签: promise rxjs observable