无法将自定义运算符添加到 Observable class
Unable to add custom operator to the Observable class
我正在编写自定义运算符来加载 csv 文件并将每一行作为数据发出。这个运算符应该像 of
运算符一样工作,它是一个创建可观察对象的静态函数。我按照 operator creation 的说明,直接将运算符函数添加到 Observable 原型中。
以下代码全部用JavaScriptES6编写。
我的源码是这样的
import { Observable } from 'rxjs';
import { createInterface } from 'readline';
import { createReadStream } from 'fs';
function fromCSV(path, options) {
return Observable.create((subscriber) => {
let readStream = createReadStream(path);
let reader = createInterface({ input: readStream });
let isHeader = true;
let columns;
reader.on('line', (line) => {
if (isHeader) {
columns = line.split(',');
isHeader = false;
} else {
let values = line.split(',');
let valueObject = {};
for (let i = 0, n = columns.length; i < n; i++) {
valueObject[columns[i]] = values[i] || undefined;
}
subscriber.next(valueObject);
}
});
reader.on('close', () => subscriber.complete());
readStream.on('error', (error) => subscriber.error(error));
});
}
Observable.prototype.fromCSV = fromCSV;
运算符函数看起来完全正确,但是当我尝试像这样使用这个运算符时
import { Observable } from 'rxjs';
import './rx-from-csv';
Observable.fromCSV(testCSV)
.subscribe((row) => {
console.log(row);
});
它抛出错误 TypeError: _rxjs.Observable.fromCSV is not a function
。所以函数绑定失败了,我不知道为什么会这样:-(感谢任何帮助。
这让我特别困惑,因为我已经成功地为 another custom csv operator.
完成了类似的运算符绑定
问题是 TypeScript 不知道运算符,因为它无法在 RxJS 的 *.d.ts
.
中找到它
看看默认的 RxJS 运算符是如何完成的:https://github.com/ReactiveX/rxjs/blob/master/src/add/operator/bufferCount.ts
在你的情况下,你只需要 declare module ...
部分和 Observable 定义的正确路径。例如:
function fromCSV(path, options) {
...
}
Observable.prototype.fromCSV = fromCSV;
declare module 'rxjs/Observable' {
interface Observable<T> {
fromCSV: typeof fromCSV;
}
}
原来是我添加静态函数的方式不对。有关详细信息,请参阅 this post。
添加静态函数到Observable
class,代码需要
Observable.fromCSV = fromCSV;
将函数添加到 class 的原型将使其仅在更新 class 后可用。
我正在编写自定义运算符来加载 csv 文件并将每一行作为数据发出。这个运算符应该像 of
运算符一样工作,它是一个创建可观察对象的静态函数。我按照 operator creation 的说明,直接将运算符函数添加到 Observable 原型中。
以下代码全部用JavaScriptES6编写。
我的源码是这样的
import { Observable } from 'rxjs';
import { createInterface } from 'readline';
import { createReadStream } from 'fs';
function fromCSV(path, options) {
return Observable.create((subscriber) => {
let readStream = createReadStream(path);
let reader = createInterface({ input: readStream });
let isHeader = true;
let columns;
reader.on('line', (line) => {
if (isHeader) {
columns = line.split(',');
isHeader = false;
} else {
let values = line.split(',');
let valueObject = {};
for (let i = 0, n = columns.length; i < n; i++) {
valueObject[columns[i]] = values[i] || undefined;
}
subscriber.next(valueObject);
}
});
reader.on('close', () => subscriber.complete());
readStream.on('error', (error) => subscriber.error(error));
});
}
Observable.prototype.fromCSV = fromCSV;
运算符函数看起来完全正确,但是当我尝试像这样使用这个运算符时
import { Observable } from 'rxjs';
import './rx-from-csv';
Observable.fromCSV(testCSV)
.subscribe((row) => {
console.log(row);
});
它抛出错误 TypeError: _rxjs.Observable.fromCSV is not a function
。所以函数绑定失败了,我不知道为什么会这样:-(感谢任何帮助。
这让我特别困惑,因为我已经成功地为 another custom csv operator.
完成了类似的运算符绑定问题是 TypeScript 不知道运算符,因为它无法在 RxJS 的 *.d.ts
.
看看默认的 RxJS 运算符是如何完成的:https://github.com/ReactiveX/rxjs/blob/master/src/add/operator/bufferCount.ts
在你的情况下,你只需要 declare module ...
部分和 Observable 定义的正确路径。例如:
function fromCSV(path, options) {
...
}
Observable.prototype.fromCSV = fromCSV;
declare module 'rxjs/Observable' {
interface Observable<T> {
fromCSV: typeof fromCSV;
}
}
原来是我添加静态函数的方式不对。有关详细信息,请参阅 this post。
添加静态函数到Observable
class,代码需要
Observable.fromCSV = fromCSV;
将函数添加到 class 的原型将使其仅在更新 class 后可用。