RxJS中的可用地图?

时间:2015-08-04 09:27:19

标签: javascript reactive-cocoa rxjs

我来自iOS领域,我广泛使用ReactiveCocoa。在RAC中,当tryMap操作失败时,sendError运算符为map

Rx.JS中是否有等价物?我可以使用flatMap和另一个Observable来模仿类似的行为,但这看起来确实有点过分。

谢谢!

2 个答案:

答案 0 :(得分:4)

Brandon的回答解释了捕获错误并通过onNext流传递错误的好方法。

我最初的问题是简单地结束流并传播Error,这显然在RxJS中很好地实现了throw map操作块内的异常try {} catch {}。我猜测RxJS将整个操作包装在Error块中,并通过向下发送throw流来优雅地处理异常。

我写这个作为来自ReactiveCocoa的人的参考,由于Swift语言限制不允许例外,目前的实现不允许Observable.just(1) .map(num => { if (num == 1) { throw new Error('error') } return num; }) .subscribeOnError(console.log) // prints 'error' 这是在Swift 2中修复的。

class

答案 1 :(得分:0)

我假设您希望在映射操作失败时结束流?我不认为它内置了RxJS,但写起来相当容易。您只需捕获错误并让tryMap基本上返回Either类型的构造,该构造可能是错误或映射结果:

Rx.Observable.prototype.tryMap = function(selector) {
  var mapSelector = function(value, index, obs) {
    try {
      return {
        value: selector(value, index, obs)
      };
    } catch (e) {
      return {
        error: e
      };
    }
  };
  return this.map(mapSelector);
};

// Usage:
Rx.Observable
  .of(1, 2, 3, 4, 5)
  .tryMap(function(v) {
    if ((v % 2) === 1) {
      throw new Error("odd numbers are evil");
    }

    return v / 2;
  })
  .subscribe(function(result) {
    if (result.error) {
      console.log("error: " + result.error.message);
    } else {
      console.log("result: " + result.value);
    }
  });
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>
<script src="https://rawgit.com/Reactive-Extensions/RxJS/master/dist/rx.all.js"></script>