Javascript Rxjs包装D3中的其他库函数(可观察)
我只是不明白这个概念,我在寻找启示。我试图观察何时提取数据,但过程混乱了。这就是我目前所拥有的。ajax请求是通过d3.tsv完成的Javascript Rxjs包装D3中的其他库函数(可观察),javascript,ajax,d3.js,observable,rxjs,Javascript,Ajax,D3.js,Observable,Rxjs,我只是不明白这个概念,我在寻找启示。我试图观察何时提取数据,但过程混乱了。这就是我目前所拥有的。ajax请求是通过d3.tsv完成的 var test = Rx.Observable.just( d3.tsv("https://gist.githubusercontent.com/mbostock/3885304/raw/37bd91278846c053188a130a01770cddff023590/data.tsv", function(d) {
var test = Rx.Observable.just(
d3.tsv("https://gist.githubusercontent.com/mbostock/3885304/raw/37bd91278846c053188a130a01770cddff023590/data.tsv",
function(d) {
return {
letter: d.letter,
frequency: +d.frequency
};
},
function(error, rows) {
console.log('mytest2',rows);
}
)
);
var observer = Rx.Observer.create(
function (x) { console.log('onNext: %s', x); },
function (e) { console.log('onError: %s', e); },
function () { console.log('onCompleted'); });
var subscription = test.subscribe(observer);
虽然这个ajax请求在技术上可行,但所有可观察的函数都发生在数据到达之前。如果我的“onNext”日志向我提供数据,而不是仅在d3.tsv函数中获取数据,我将如何构造此函数?有RxJS运算符专门用于将回调转换为可观察对象(
.fromCallback
,.fromNodeCallback
)。但是,它们在这里不起作用,因为它们需要一个回调,而该回调是最后一个参数。这里有两个回调,一个用于成功,一个用于结果。我不知道在这种情况下有什么特殊的操作符,所以我建议您使用自定义的helper函数
我已经找到了我的问题的答案,但我想找一个更好的。我发现的是:
var url = "https://gist.githubusercontent.com/mbostock/3885304/raw/37bd91278846c053188a130a01770cddff023590/data.tsv"
var fetch = Rx.Observable.fromNodeCallback(d3.tsv);
var source = fetch(url, function(d) {
return {
letter: d.letter,
frequency: +d.frequency
};
})
var observer = Rx.Observer.create(
function (o) {
console.log('Next: success!', o);
},
function (err) {
console.log('Error: ' + err);
},
function () {
console.log('Completed');
});
var subscription = source.subscribe(observer);
我唯一的问题是,我不知道如何进行过滤,因此我愿意接受更好的解决方案。感谢您的反馈。遗憾的是,它没有起作用,但它让我思考如何找到正确的答案。我从NodeCallback看了更深入的研究,并得到了成功。问题是我不知道如何将工作代码转换成一个带有过滤器的代码,例如.map、.flatmap、.filter等等。如果你有任何建议,我将答案贴在下面。如果它包含一个新的Rx.AsyncSubject(),则更好,因为我认为这是我需要去做的方向。这里的jsfiddle:。这回答了你提出的问题。如果你有一个问题或另一个问题的扩展,请发布一个新的问题,除非它是一件小事。这主要回答了我的问题。我已经更新了fiddle以拥有d3库,这将返回数据集的第一项。我的目标是像我的解决方案一样返回整个数据集,但要具有回答的灵活性。如果你能更新那就太好了。我得承认我对D3一无所知。我是否应该理解为每行调用回调?我的代码假定它只被调用一次,这就是为什么我在发出第一项后立即完成。如果是这种情况,删除解决方案的
.onCompleted
部分就足够了。查阅另一方面,你知道你没有办法完成这个主题,除非你的d3函数有这样一个事件。“我只是不明白这个概念,我在寻找启示”我知道这种感觉:D
var url = "https://gist.githubusercontent.com/mbostock/3885304/raw/37bd91278846c053188a130a01770cddff023590/data.tsv"
var fetch = Rx.Observable.fromNodeCallback(d3.tsv);
var source = fetch(url, function(d) {
return {
letter: d.letter,
frequency: +d.frequency
};
})
var observer = Rx.Observer.create(
function (o) {
console.log('Next: success!', o);
},
function (err) {
console.log('Error: ' + err);
},
function () {
console.log('Completed');
});
var subscription = source.subscribe(observer);