💡 打平类操作符可以接收 promises 而不需要 observable 包装!
💡 你还可以使用 from 达到同样的效果!
import { of } from 'rxjs/observable/of';
import { fromPromise } from 'rxjs/observable/fromPromise';
import { mergeMap, catchError } from 'rxjs/operators';
// 基于输入来决定是 resolve 还是 reject 的示例 promise
const myPromise = willReject => {
return new Promise((resolve, reject) => {
if (willReject) {
reject('Rejected!');
}
resolve('Resolved!');
});
};
// 先发出 true,然后是 false
const source = of(true, false);
const example = source.pipe(
mergeMap(val =>
fromPromise(myPromise(val)).pipe(
// 捕获并优雅地处理 reject 的结果
catchError(error => of(`Error: ${error}`))
)
)
);
// 输出: 'Error: Rejected!', 'Resolved!'
const subscribe = example.subscribe(val => console.log(val));
- fromPromise 📰 - 官方文档
- 创建操作符: from, fromArray, fromPromise 📹 💵 - André Staltz
- fromPromise - 指南
📁 源码: https://github.com/ReactiveX/rxjs/blob/master/src/internal/observable/fromPromise.ts