2016-07-28 1 views
0

У меня есть довольно простой случай использования:RxJs: Как реализовать HTTP удалить с flatMap

  • Там в table с некоторыми записями (каждый из которых имеет уникальный идентификатор и номер индекса)
  • Каждая запись имеет удаления button
  • onclick: вызов subject.onNext, который затем выполняет HTTP-вызов с помощью удаления flatMap
  • в случае успеха: удалить соответствующую строку из таблицы

Оказываемые 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

flatMap может взять вторую функцию с двумя параметрами: первоначальный onNext значение, и flatMap результат первой функции в:

var delete = new Rx.Subject() 
    .flatMap(function(data) { 
     return MyService.doHTTPDelete(data.id); 
    }, 
    function(originalData, deleteResponse) { 
     // originalData is your id/index object 
     // deleteResponse is the value from the doHTTPDelete 
     return { 
      entry: originalData, 
      response: deleteResponse 
     } 
    }) 
    .subscribe(function(results) { 
     // results.entry is your original onclick data 
     console.log(results.entry.index); 
    }) 
0

Я нашел обходной путь, это довольно просто. Но я не знаю, имеются ли какие-либо возможные побочные эффекты или нежелательное поведение:

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

 Смежные вопросы

  • Нет связанных вопросов^_^