【问题标题】:fromPromise does not exist on type Observable可观察类型上不存在 fromPromise
【发布时间】:2018-01-28 19:16:55
【问题描述】:

在使用 rxjs 的 Angular 2 中,我试图将 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 错误,它仍然会导致错误:

(<any>Observable).fromPromise

错误:

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

在 rxjs repo here 上报告了一些类似的问题,但那里也没有解决方案。

【问题讨论】:

  • 请检查您正在使用的 typescript 和 rxjs 的版本,Observable.fromPromise 应该可以工作。在 rxjs -> add -> observable -> fromPromise.js 中检查文件 fromPrommis.js
  • rxjs 5.4.0 打字稿 2.3.4
  • 而且 fromePromise.js 确实存在
  • 这就解释了。查看最新版本,它应该包含该文件。如果你是最新的,那么只需删除你的节点模块并执行 npm i。

标签: angular promise rxjs observable es6-promise


【解决方案1】:

更新:

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 中发布pipeable operators 后,强烈建议不要使用猴子补丁方法。考虑使用静态方法选项。

原答案

rxjs 5.4.x 开始,fromPromise 可以用作静态方法,也可以修补到Observable 原型中。

首先,您可以执行以下操作:

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

var observableFromPromise = fromPromise(promiseSrc);

有关此方法的更多信息here

要执行第二个,您需要更改导入语句:

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

var observableFromPromise = Observable.fromPromise(promiseSrc);

有关此方法的更多信息here

我个人推荐第一种,考虑到第二种方法基本上是第一种,不同的是Observable原型被改变了。

【讨论】:

    【解决方案2】:

    就像 Jota 所说的“来自”就是答案。

    你可以从这里找到参考

    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);
            });
        });
    }
    

    【讨论】:

      猜你喜欢
      • 2018-10-12
      • 2017-04-01
      • 1970-01-01
      • 2017-02-27
      • 2018-11-03
      • 2018-12-05
      • 1970-01-01
      • 2022-07-20
      • 2019-03-09
      相关资源
      最近更新 更多