RxJs:如何使用flatMap实现HTTP删除

时间:2016-07-28 23:59:37

标签: javascript reactive-programming rxjs

我有一个非常简单的用例:

  • table有一些条目(每个条目都有唯一的ID和索引号)
  • 每个条目都有一个删除button
  • onclick:致电subject.onNext,然后通过flatMap
  • 执行HTTP删除通话
  • 如果成功:从表中删除相应的行

呈现的HTML看起来(简化)如下:

<table>
  <tr>
    <td>Entry1</td>
    <td><button onclick="delete.onNext({id:'a', index:0})"></td>
  </tr>
  <tr>
    <td>Entry2</td>
    <td><button onclick="delete.onNext({id:'b', index:1})"></td>
  </tr>
</table>

删除主题/可观察性:

var delete = new Rx.Subject()
    .flatMap(function(data) {
        return MyService.doHTTPDelete(data.id);
    })
    .retry() // keep the Subject alive if HTTP call fails
    .doOnError(function(err) {
        console.log("Something went wrong...", err);
    })
    .subscribe(function(???) {
        // here I need the index
    });

正如您所看到的,MyService.doHTTPDelete来电并不了解data.index(当然也不应该!)。

我认为这是一个非常常见的用例。但我没有在网上找到解决方案。

你知道如何解决它吗?

2 个答案:

答案 0 :(得分:2)

IsValidTest()可以使用两个参数获取第二个函数:原始flatMap值和第一个函数的onNext结果:

flatMap

答案 1 :(得分:0)

我找到了一些解决方法,这非常简单。但我不知道是否有任何可能的副作用或不良行为:

var delete = new Rx.Subject()
    .flatMap(function(data) {
        return MyService.doHTTPDelete(data.id)
                .map(function() { return data; });
    })
    ....;