在类型 Observable 上,不存在 fromPromise 方法。

101

在Angular 2中使用rxjs,我试图将一个Promise转换成Observable。像许多在线指南展示的那样,我在Observable上使用了fromPromise。但是会抛出错误:

Property 'fromPromise' does not exist on type 'typeof Observable'.

Observable 的导入方式如下:

import { Observable } from "rxjs/Observable";

试图像其他操作符一样导入fromPromise会导致错误:

import 'rxjs/add/operator/fromPromise';
即使我抑制了 TypeScript 的错误,它仍会导致错误:

即使我抑制了 TypeScript 的错误,它仍会导致错误:

(<any>Observable).fromPromise

错误:

Uncaught (in promise): TypeError: __WEBPACK_IMPORTED_MODULE_3_rxjs_Observable__.Observable.fromPromise is not a function

在rxjs存储库上也报告了类似的问题这里,但那里也没有解决方案。


1
请检查您正在使用的TypeScript和RxJS版本,Observable.fromPromise应该可以正常工作。在rxjs->add->observable->fromPromise.js中检查fromPromise.js文件。 - Jorawar Singh
rxjs 5.4.0 typescript 2.3.4 - Ahmad
而 fromePromise.js 确实存在。 - Ahmad
那就解释一下吧。请查看最新版本,它应该包含那个文件。如果你已经在最新版本上了,那么只需删除你的node模块并执行npm i即可。 - Jorawar Singh
2个回答

214

更新:

rxjs 6.0.0-beta.3 开始,操作符和可观察对象创建器应该从 rxjs 导入。此外,fromPromise 不再是公共 API 的一部分,而是包含在 from 方法中。

TL;DR;

概括:

对于 rxjs 6.0.0,请使用:

import { from } from 'rxjs';

var observableFromPromise =  from(promiseSrc);

更新:

rxjs 5.5.x中引入了管道运算符,强烈不建议使用猴子补丁方法,建议考虑使用静态方法选项。

原始回答:

rxjs 5.4.x起,可以将fromPromise用作静态方法或可添加到Observable原型中。

对于第一种选择,您可以执行以下操作:

import { fromPromise } from 'rxjs/observable/fromPromise';

var observableFromPromise = fromPromise(promiseSrc);

关于这种方法的更多信息,请点击此处

要进行第二步,您需要更改导入语句:

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

var observableFromPromise = Observable.fromPromise(promiseSrc);

了解更多关于这种方法的信息在这里

个人而言,我会推荐第一种方法,因为第二种方法基本上是第一种方法,不同之处在于Observable原型被更改。


9

就像 Jota 所说的,'from' 是答案。

您可以从这里找到参考资料

https://www.learnrxjs.io/operators/creation/from.html

然而,如果您想指定 'Promise to Observable',您可以使用如下的 'fromPromise'。

  import { from as fromPromise, Observable} from 'rxjs';
  ...

  private getObservable(): Observable<any> {
    return fromPromise(this.promise);
  }


  private getPromise() {

   this.promise = new Promise((resolve, reject) => {
      this.service.getPromise()
        .then(response => {
          //  do sth
          resolve(response);
        });
    });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接