从回调中观察到,其中回调不是错误优先的

时间:2018-10-03 04:36:17

标签: rxjs observable rxjs5 rxjs6

说我有这个:

const register = function(cb){

   process.on('message', m => {

         cb(m, (err, v) => {

            process.send({error: err, value: v});

         });
   });

};

我们像上面这样使用

register((m, cb) => {

   // do something with m

   setTimeout(() => {
      cb('some error', m);
   }, 100);

});

我的问题是-是否可以使用Rx.Observable来进行操作-Rx.Observable.fromCallback的大多数示例都将包装错误优先回调。但是在这种情况下,回调并非首先出错。作为练习,如何使它适用于非错误优先回调?这是一个开始:

const {Observable, bindNodeCallback} = require('rxjs');

const obs = bindNodeCallback(register);

const subscription = obs().subscribe(v => {

}, e => {
       // this gets hit since the first arg is not an error
 });

有人处理过这个吗?

更新,我走得更近一些,下面的示例使用setInterval而不是process.on('message'),因此更易于进行测试:

https://gist.github.com/ORESoftware/ea5d754d6ca6c92ca7e3bddc7eb318c2

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您想创建一个Observable,它在'message'收到process事件时发出。

如果是这种情况,我认为bindCallback是不正确的方法。调用bindCallback创建的函数的Observable返回仅发出一次,并且发出作为调用调用参数的数据。

您想要的是每次收到消息时都会发出多次的Observable(同样,如果我的理解正确)。

为此,您可以使用Observable的create静态方法。该代码可能类似于以下内容

Observable<any>(
        (subscriber: Observer<any>) => {
            process.on('message', 
                m => {
                    // do stuff with m
                }
            );
        }
);

您可能会在this articlebindCallback周围找到一些推理。