javascript – 如何从函数创建Observable?

我想调用一个函数(同步),然后使用它的返回值作为初始发射(随后将一些其他运算符链接生成的observable上).

我想在订阅期间调用函数,因此我不能只使用Observable.of(()=> getSomeValue()).我见过bindCallback(以前来自Callback),但我不认为它可以用于这个任务(如果我错了,请纠正我).我已经在v4文档中看到了启动静态运算符,但显然它没有在v5中实现(并且没有表明它在路上). RxJava也有fromCallable运算符,它完全与afaik完全相同.

我能想到的只有这样:

Observable.create((observer: Observer<void>) => {
  let val = getSomeValue();
  observer.next(val);
  observer.complete();
})

我认为就是这样.但这对于简单的事情来说似乎很复杂,应该像Observable.fromFunction(()=> getSomeValue())如果我想异步运行它,比如启动运算符呢?如何在RxJS的当前版本中执行此操作?

解决方法

我倾向于尽可能避免任何显式使用Observable.create,因为通常它不仅需要管理事件发射而且还需要管理您的拆卸逻辑.

您可以使用Observable.defer.它接受一个返回Observable或类似Observable的函数(读取:Promise,Array,Iterators).因此,如果您有一个返回异步事物的函数,它就像:

Observable.defer(() => doSomethingAsync());

如果您希望这可以使用同步结果,那么执行:

Observable.defer(() => Observable.of(doSomethingSync()));

注意:这样创建它将重新运行每个订阅功能.这与Observable.bindCallback的结果不同,后者存储函数调用结果而不重新执行该函数.因此,如果您需要这种行为,则需要使用适当的多播运算符.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...