Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Rxjs包装D3中的其他库函数(可观察)_Javascript_Ajax_D3.js_Observable_Rxjs - Fatal编程技术网

Javascript Rxjs包装D3中的其他库函数(可观察)

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) {

我只是不明白这个概念,我在寻找启示。我试图观察何时提取数据,但过程混乱了。这就是我目前所拥有的。ajax请求是通过d3.tsv完成的

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);