首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RxJS:等待一个值,然后释放观察者

RxJS:等待一个值,然后释放观察者
EN

Stack Overflow用户
提问于 2017-07-11 14:16:28
回答 2查看 1.5K关注 0票数 0

我真的不确定如何问这个问题,但我的应用程序中有类似于此的代码,我想知道是否有更好的方法来处理它。

代码语言:javascript
运行
复制
const d = this.$q.defer();
const s = this.change$  // <- A regular Subject, that emits whenever changes to the model arrive
    .subscribe(() => {
        d.resolve(this.promiseWereWaitingFor);
        s.unsubscribe();
    });

return d.promise;

我尝试过使用takeLast之类的东西,但我不想让流完成,因为它会对用户输入(例如,搜索字段)做出反应。据我所知,.toPromise()只有在流完成时才会解析。

有没有可能简化我的代码,避免总是订阅和取消订阅?更重要的是,我的代码是不是很糟糕?

EN

Stack Overflow用户

发布于 2017-07-12 09:17:29

为了使用从可观察对象派生的一系列promises,我将假设您的逻辑如下:

代码语言:javascript
运行
复制
// Handle a series of promises.
function handleSeries() {
  return getNewPromise().then(handleValue).then(handleSeries);
}

其中(使用原生承诺),getNewPromise的实现方式如下:

代码语言:javascript
运行
复制
let promise, resolveFunc, rejectFunc;

function getNewPromise() { return promise; }

function makeNewPromise() {
   promise = new Promise((resolve, reject) => {
     resolveFunc = resolve;
     rejectFunc = reject;
   });
}

makeNewPromise();

this.changes$.subscribe(
  change => { resolveFunc(change); makeNewPromise(); },
  error => { rejectFunc(error); makeNewPromise(); }
);

换句话说,我们定义了一个名为promise的承诺,然后订阅可观察对象,并在每次发射时解决或拒绝该承诺,然后创建一个新的承诺,当消费者处理完之前的承诺时,他可以使用getNewPromise获得该承诺。

这种逻辑并不完美,因为如果可观察对象发出的速度快于handleValue处理它们的速度,它将跳过一些承诺。要解决这个问题,需要以某种方式对承诺进行排队。但你明白我的意思。

但实际上,您在这里所完成的就是将一个完美的可观察对象转换为通过重复调用getNewPromise返回的一系列promises。但一个可观察对象已经是一系列的东西,subscribe允许你一次获取一个。因此,上面的整个代码几乎完全等同于

代码语言:javascript
运行
复制
this.changes$.subscribe(handleValue)

具有自动处理错误和完成的附加优点。

在你的方法中,你混合了两种不同的范式--可观察的和承诺的--以一种可能会让你和任何阅读你的代码的人感到困惑的方式。但它们的设计目的是不同的: promise代表一次性的未来价值,而observable代表未来价值的流。你似乎在试图用承诺来代表可观察到的个人排放。但可观测物上的排放已经被表示为可观测物本身。toPromise旨在弥补这种差距,在这种情况下,它是有意义的,因为事实是可观察对象只打算发出单个值,或者可能立即发出错误。

因此,如果我正确地理解了您的情况,您应该跳过使用promises,并让您的消费者按预期使用可观察对象,只需直接订阅它。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45026754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档