admin管理员组

文章数量:1302431

I am having trouble using rxjs Observable.concat function with typescript. Getting an error "Cannot read property 'apply' of undefined"

The problem seems to be only within typescript and may be specific to rxjs version 5 concat. The code seems to work with rxjs V4.

Here is a simplified version of the code illustrating the problem...

 /*jshint esnext: true */

console.clear();
console.log('started');
class test{
    observableArray: Observable<any>[]=[];

    constructor(){
        this.observableArray.push(Rx.Observable.return("Line 1"));
        this.observableArray.push(Rx.Observable.return(56));
        this.observableArray.push(Rx.Observable.create((observer)=>{
             setTimeout(()=>{
                try{
                    observer.onNext("Waited for");
                    observer.onCompleted();
                }
                catch(err){
                     observer.onError(err);
                }
             },3000);
         }));
      }

    run(){
         // ... indeterminate number of observables pushed into array.
         // The problem lies below
         var source = Rx.Observable.concat(...this.observableArray);
         // seems to transpile into js: source =   Observable_1.Observable.concat.apply(Observable_1.Observable, this.observableArray);
         // In the chrome debugger I am getting error: Cannot read property 'apply' of undefined      

         var subscription = source.subscribe(
             function (x) {
                 console.log('Next: ' + x);
             },
             function (err) {
                 console.error('Error: ' + err);
             },
             function () {
                 console.log('Completed');
         });
      }
  }

}

Here is the jsbin: ,js,console,output

I am having trouble using rxjs Observable.concat function with typescript. Getting an error "Cannot read property 'apply' of undefined"

The problem seems to be only within typescript and may be specific to rxjs version 5 concat. The code seems to work with rxjs V4.

Here is a simplified version of the code illustrating the problem...

 /*jshint esnext: true */

console.clear();
console.log('started');
class test{
    observableArray: Observable<any>[]=[];

    constructor(){
        this.observableArray.push(Rx.Observable.return("Line 1"));
        this.observableArray.push(Rx.Observable.return(56));
        this.observableArray.push(Rx.Observable.create((observer)=>{
             setTimeout(()=>{
                try{
                    observer.onNext("Waited for");
                    observer.onCompleted();
                }
                catch(err){
                     observer.onError(err);
                }
             },3000);
         }));
      }

    run(){
         // ... indeterminate number of observables pushed into array.
         // The problem lies below
         var source = Rx.Observable.concat(...this.observableArray);
         // seems to transpile into js: source =   Observable_1.Observable.concat.apply(Observable_1.Observable, this.observableArray);
         // In the chrome debugger I am getting error: Cannot read property 'apply' of undefined      

         var subscription = source.subscribe(
             function (x) {
                 console.log('Next: ' + x);
             },
             function (err) {
                 console.error('Error: ' + err);
             },
             function () {
                 console.log('Completed');
         });
      }
  }

}

Here is the jsbin: https://jsbin./naxeba/edit?html,js,console,output

Share Improve this question edited Jul 15, 2018 at 5:28 Aluan Haddad 31.9k10 gold badges83 silver badges95 bronze badges asked Apr 12, 2016 at 22:50 JeffCJeffC 2931 gold badge3 silver badges9 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 6

OK, Problem solved.

Important note for users of reactive js version 5: In typescript with rxjs, to minimize app size each operator must be specifically imported for the function/operator to be included. So the line...

import {concat} from 'rxjs/operators/concat' must be inlcuded at the top of the typescript file for concat to work.

What confused me was that I was getting intellisense in VS2015 for the Observable.concat function even though the function had not actually been imported.

I'm using rxjs 5.5.7 and had to use import 'rxjs/add/observable/concat';.

The code itself looks like: Observable.concat(...observables).subscribe etc

本文标签: javascriptTypescript rxjs Observable array concatStack Overflow