Je suis en train d'apprendre à écrire un opérateur rxjs, quand j'écris comme ceci :
function map(project: (value: T) => R): OperatorFunction {
return function mapOperation(source$: Observable): Observable {
if (typeof project !== "function") {
throw new TypeError("l'argument n'est pas une fonction...");
}
return Observable.create((observer: Observer) => {
console.log(observer.complete);
const subscription = source$.subscribe({
next: value => {
try {
observer.next(project(value));
} catch (e) {
observer.error(e);
}
},
error: observer.error,
complete: observer.complete // ici
});
return () => {
subscription.unsubscribe();
};
});
};
}
const source$ = of(1, 2, 3);
map((x: number) => x * x)(source$).subscribe(console.log);
ça ne fonctionne pas :
this._complete();
^
TypeError: this._complete n'est pas une fonction
à Object.Subscriber.complete (/Users/ahabhgk/moby-dick/FE/some-note/deep-in-rxjs/node_modules/rxjs/src/internal/Subscriber.ts:126:12)
à Object.wrappedComplete (/Users/ahabhgk/moby-dick/FE/some-note/deep-in-rxjs/node_modules/rxjs/src/internal/Subscriber.ts:248:54)
à SafeSubscriber.__tryOrUnsub (/Users/ahabhgk/moby-dick/FE/some-note/deep-in-rxjs/node_modules/rxjs/src/internal/Subscriber.ts:265:10)
à SafeSubscriber.complete (/Users/ahabhgk/moby-dick/FE/some-note/deep-in-rxjs/node_modules/rxjs/src/internal/Subscriber.ts:251:16)
à Subscriber._complete (/Users/ahabhgk/moby-dick/FE/some-note/deep-in-rxjs/node_modules/rxjs/src/internal/Subscriber.ts:148:22)
à Subscriber.complete (/Users/ahabhgk/moby-dick/FE/some-note/deep-in-rxjs/node_modules/rxjs/src/internal/Subscriber.ts:126:12)
à Observable._subscribe (/Users/ahabhgk/moby-dick/FE/some-note/deep-in-rxjs/node_modules/rxjs/src/internal/util/subscribeToArray.ts:11:14)
à Observable._trySubscribe (/Users/ahabhgk/moby-dick/FE/some-note/deep-in-rxjs/node_modules/rxjs/src/internal/Observable.ts:238:19)
à Observable.subscribe (/Users/ahabhgk/moby-dick/FE/some-note/deep-in-rxjs/node_modules/rxjs/src/internal/Observable.ts:219:14)
à Observable._subscribe (/Users/ahabhgk/moby-dick/FE/some-note/deep-in-rxjs/index.ts:10:36)
mais quand je change complete: observer.complete
en complete: () => observer.complete()
, ça marche
function map(project: (value: T) => R): OperatorFunction {
return function mapOperation(source$: Observable): Observable {
if (typeof project !== "function") {
throw new TypeError("l'argument n'est pas une fonction...");
}
return Observable.create((observer: Observer) => {
console.log(observer.complete);
const subscription = source$.subscribe({
next: value => {
try {
observer.next(project(value));
} catch (e) {
observer.error(e);
}
},
error: observer.error,
complete: () => observer.complete() // ici
});
return () => {
subscription.unsubscribe();
};
});
};
}
const source$ = of(1, 2, 3);
map((x: number) => x * x)(source$).subscribe(console.log);
pourquoi y a-t-il une différence entre complete: observer.complete
et complete: () => observer.complete()
, ce sont toutes des fonctions