我试着把我的头绕在可观察的物体上。我喜欢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;
// ...
});
这里的任何帮助都将不胜感激。我唯一的替代解决方案是创建EventEmitter
s。但我想这是服务部门的糟糕做法
使用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运算符结合(例如合并
,ConcatMap
,forkJoin
,组合最新
...)或转换可观察对象(例如切换地图
,合并地图
,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>;
示例中,from
和defer
之间的差异: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);
试试这个:
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运算符的完整引用。
如果您使用的是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