javascript - Rxjs 包装 D3 (Observable) 中的其他库函数

标签 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) {
          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 请求在技术上可行,但所有 Observable 函数都在数据到达之前发生。我将如何构造这个,让我的“onNext”日志为我提供数据,而不是仅在 d3.tsv 函数内部获取数据?

最佳答案

有一些 RxJS 运算符专门用于将回调转换为可观察量(.fromCallback.fromNodeCallback)。然而,它们在这里不起作用,因为它们期望一个回调,而该回调是最后一个参数。这里有两个回调,一个用于成功,一个用于结果。我不知道针对这种情况有任何特殊的运算符,因此我建议您使用自定义辅助函数。

function d3fn (url, success_handler, error_handler) {
  success_handler ({
    letter : 'letter',
    frequency : 9
  });
}

var d3 = {tsv : d3fn};

function fromD3Callback (d3fn, ctx) {
return function () {
  var args = Array.prototype.slice.call(arguments);
  var subject = new Rx.AsyncSubject();

  function success_handler () {
    subject.onNext.apply(subject, Array.prototype.slice.call(arguments));
    subject.onCompleted();
  }

  function error_handler () {
    subject.onError(Array.prototype.slice.call(arguments));
  }

  args.push(success_handler);
  args.push(error_handler);

  d3fn.apply(ctx, args);
  return subject.asObservable();
}
}

var test = fromD3Callback(d3.tsv)("https://gist.githubusercontent.com/mbostock/3885304/raw/37bd91278846c053188a130a01770cddff023590/data.tsv")
  .map(function(d) {
          return {
            letter: d.letter,
            frequency: +d.frequency
          };
        })
  .catch(function(error, rows) {
          console.log('mytest2',rows);
          return Rx.Observable.throw({error: error, rows: rows});
        });

var observer = Rx.Observer.create(
  function (x) { console.log('onNext: %o', x); },
  function (e) { console.log('onError: %s', e); },
  function () { console.log('onCompleted'); });

var subscription = test.subscribe(observer);

关于javascript - Rxjs 包装 D3 (Observable) 中的其他库函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35041627/

相关文章:

javascript - 在 Qualtrics 中的嵌入数据名称中使用变量

php - 尝试获取项目 id 以与 ajax 一起使用

javascript - 尝试根据之前的 2 个选择来填充选择

javascript - Google Drive SDK JavaScript 文件共享对话框给出 "Refused to display document because display forbidden by X-Frame-Options"

javascript - RxJS - 无限滚动 - 在上一个未到达时发送请求

javascript - 鼠标悬停时堆栈图中的淡入淡出栏

javascript - d3.js 内气泡图

javascript - 在更新快速移动的 UI 状态时,如何提高 Redux 的性能?

javascript - 如何将默认下拉样式更改为导航栏链接并且默认选择事件仍然有效?

javascript - JQuery点击事件不触发