当前位置: 首页 > 知识库问答 >
问题:

将promise转换为可观测

楚嘉纳
2023-03-14

我试着把我的头绕在可观察的物体上。我喜欢Observable解决开发和可读性问题的方式。正如我读到的,好处是巨大的。

HTTP和集合上的可观察对象似乎是直截了当的。我怎样才能把这样的东西转换成可观察的模式呢。

这来自我的服务组件,用于提供身份验证。我希望它能像Angular2中的其他HTTP服务一样工作——支持数据、错误和完成处理程序。

js prettyprint-override">firebase.auth().createUserWithEmailAndPassword(email, password)
  .then(function(firebaseUser) {
    // do something to update your UI component
    // pass user object to UI component
  })
  .catch(function(error) {
    // Handle Errors here.
    var errorCode = error.code;
    var errorMessage = error.message;
    // ...
  });

这里的任何帮助都将不胜感激。我唯一的替代解决方案是创建EventEmitters。但我想这是服务部门的糟糕做法

共有3个答案

秦凯旋
2023-03-14

使用from将先前创建的promise直接转换为可观察的promise。

import { from } from 'rxjs';

// getPromise() is called once, the promise is passed to the Observable
const observable$ = from(getPromise());

$将是有效地向订阅服务器重放Promises值的热可观察对象。

它是一个热门的可观察对象,因为生产者(在本例中是promise)是在可观察对象之外创建的。多个订户将共享同一promise。如果内部promise已经解决,可观察对象的新订户将立即获得其价值。

使用具有Promise工厂函数的延迟作为输入,以延迟创建和转换Promise为可观察对象。

import { defer } from 'rxjs';

// getPromise() is called every time someone subscribes to the observable$
const observable$ = defer(() => getPromise());

$将是一个冷的可观察的。

它是一个冷的可观察对象,因为生产者(promise)是在可观察对象内部创建的。每个订户将通过调用给定的Promise factory函数来创建一个新的Promise。

这允许您创建一个可观察的$,而无需立即创建并执行promise,也无需与多个订户共享此promise。observable$的每个订户有效地从(promiseFactory())调用。订阅(订户)。因此,每个订户创建并将其自己的新promise转换为新的可观察对象,并将自己附加到这个新的可观察对象上。

大多数RxJS运算符结合(例如合并ConcatMapforkJoin组合最新...)或转换可观察对象(例如切换地图合并地图concatMap>catchError...)直接接受promise。如果您使用其中一个,您不必首先使用from来包装promise(但是要创建冷可观察的,您可能仍然需要使用延迟)。

// Execute two promises simultaneously
forkJoin(getPromise(1), getPromise(2)).pipe(
  switchMap(([v1, v2]) => v1.getPromise(v2)) // map to nested Promise
)

检查留档或实现,以查看您使用的运算符是否接受观测输入SubcribableOrPromise

type ObservableInput<T> = SubscribableOrPromise<T> | ArrayLike<T> | Iterable<T>;
// Note the PromiseLike ----------------------------------------------------v
type SubscribableOrPromise<T> = Subscribable<T> | Subscribable<never> | PromiseLike<T> | InteropObservable<T>;

示例中,fromdefer之间的差异:https://stackblitz.com/edit/rxjs-6rb7vf

const getPromise = val => new Promise(resolve => {
  console.log('Promise created for', val);
  setTimeout(() => resolve(`Promise Resolved: ${val}`), 5000);
});

// the execution of getPromise('FROM') starts here, when you create the promise inside from
const fromPromise$ = from(getPromise('FROM'));
const deferPromise$ = defer(() => getPromise('DEFER'));

fromPromise$.subscribe(console.log);
// the execution of getPromise('DEFER') starts here, when you subscribe to deferPromise$
deferPromise$.subscribe(console.log);
扶绍辉
2023-03-14

试试这个:

import 'rxjs/add/observable/fromPromise';
import { Observable } from "rxjs/Observable";

const subscription = Observable.fromPromise(
    firebase.auth().createUserWithEmailAndPassword(email, password)
);
subscription.subscribe(firebaseUser => /* Do anything with data received */,
                       error => /* Handle error here */);

您可以在此处找到对fromPromise运算符的完整引用。

唐伟
2023-03-14

如果您使用的是RxJS 6.0.0:

import { from } from 'rxjs';
const observable = from(promise);
 类似资料:
  • 问题内容: 我找到了一个使用Promise的现有库,但是它不使用bluebird。库函数并没有bluebird喜欢或拥有的所有其他功能。如何将“正常”或“非蓝鸟”承诺转换为具有蓝鸟提供的所有其他功能的蓝鸟承诺? 我试过包装在现有的承诺,并和他们俩谁也没工作。 问题答案: 使用-它会占用所有可能的内容,例如来自其他一些实现的承诺,并将其吸收到Bluebird承诺中。 请记住,“解决”一词可能会误导您

  • 问题内容: 我正在尝试将项目设置为表视图,但是setitems方法需要一个可观察的列表,而我的模型中却有一个可观察的集合.FXCollections实用程序类没有给定可观察的集合来创建可观察的列表的方法。类强制转换异常(按预期)。 目前,我正在使用这种代码 而且我有一些问题: 在表中进行编辑是否会按预期更新基础集? 这是这样做的“正确”方法吗 简而言之,我需要样式指南或最佳做法,以便在可观察集和可

  • 有没有办法将ArrayList转换为ObservableList?我想在不遍历ArrayList的情况下完成它。 更具体地说,我使用ORMLite从数据库中获取数据,我需要作为从DB获取数据的方法的输出。 目前我正在做这样的事情: 我想这样做:

  • 问题内容: 我正在使用播放框架和Apache Kafka。 我有一个POST方法,它将消息发送到Kafka。Kafka有一个API方法 public java.util.concurrent.Future send(ProducerRecord记录,回调回调) 其中Javadoc说 异步将记录发送到主题,并在确认发送后调用提供的回调。 我正在使用play框架公开此功能。我想从Controller方

  • 我正在使用play框架和Apache Kafka。 我有一个POST方法,它向Kafka发送消息。Kafka有一个API方法 公共java.util.concurrent。未来发送(生产记录记录、回调) 其中Javadoc说 异步发送记录到主题,并在发送被确认时调用提供的回调。 我将使用play框架公开此功能。我想返回一个<代码>promise