Unhandled Promise rejection: Rx_1.Subject is not a constructor ; Zone: ; Task: Promise.then ; Value: TypeError: Rx_1.Subject is not a constructor

Unhandled Promise rejection: Rx_1.Subject is not a constructor ; Zone: ; Task: Promise.then ; Value: TypeError: Rx_1.Subject is not a constructor

我有一个 Angular 2 应用程序,它使用 systemjs 到 map/load。

在项目中导入rxjs,并引用它是可以的,但是部署代码时,无法构造一个Subject变量,消息:

"Unhandled Promise rejection: Rx_1.Subject is not a constructor ; Zone: ; Task: Promise.then ; Value: TypeError: Rx_1.Subject is not a constructor".

在 systemjs 上接收:

(function (global) {
var map = {
    'app': 'app',  
    '@angular': 'js/@angular', 
     // other libraries
    'rxjs': 'js/rxjs', 
};

// packages tells the System loader which filename and/or extensions to look for by default (when none are specified) 

var packages = {
    'app': { main: 'main.js', defaultExtension: 'js' },
    'rxjs': { defaultExtension: 'js' }
};

我实例化主题的方式:

import { Injectable } from '@angular/core';
import { Subject } from "rxjs/Rx";

@Injectable()
export class MyService {

constructor(private http: Http) {
    let b = new Subject<string>(); // exteption HERE
    let m = b.asObservable(); 
    b.next("k");

所有 rxjs 都在浏览器中正常加载。


更新:再看看这个,如果我在我的 Angular 服务中导入 Rx 为:

import * as Rx from 'rxjs/Rx';

然后检查控制台中的 Rx 对象,它只有一个默认值,并且 __useDefault 属性 getter。 其他一切,Observable,Subject 都可以通过它们访问。

喜欢做:

var observable = Rx.Observable.create(function (observer) {
        observer.next(1);
    });

返回:

VM1083:1 Uncaught TypeError: Cannot read property 'create' of undefined

而当然:

var observable = Rx.default.Observable.create(function (observer) {
        observer.next(1);
    });

工作正常。

我的项目是在 Typescript 中,我尝试了目标编译 es5es6

这是如何实例化 Subject 的示例

@Injectable()
export class MyService {

    public invokeEvent:Subject<any> = new Subject();

    constructor() {}
}

关于 Observables 这是一本关于 Using Observables 的好书。

看完How to import `Observable` from `Rx` (not angular)

成功解封

我将 tsconfig.json 模块从 "system" 更改为 "commonjs",并且 Rx lib 文件在没有 getter 的情况下进行转译。

我之前正在导入“从 'rxjs/Subject' 导入 { Subject }”。 更改为“从 'rxjs' 导入 { 主题}”。 这为我解决了问题。