2017-11-09 13 views
0

私はリアクティブプログラミングには新しく、AJAXナビゲーションサイドナビゲーションの作成に問題があります。rxjsの新しいemmisionに関するAjaxリクエストをキャンセルする

<ul> 
    <li>change_password</li> 
    <li>update_profile</li> 
</ul> 
<h3> The result </h3> 
<div id="theContent"></div> 

<script type="text/javascript"> 
var listClick$ = Rx.Observable.create(function(observer){ 

      $('li').click(function(){ 

       let pageName = $(this).html();  
       observer.next(pageName); 

      }); 

     }).startWith('change_password').flatMap(function(pageName){ 

      return Rx.Observable.fromPromise($.getJSON('http://localhost:3000/settings/'+pageName));   
     }); 
listClick$.subscribe(function(gottenJson){ 

$('#theContent').html(gottenJson.page); 
}); 
</script> 

CHANGE_PASSWORDまたはupdate_profile i上をクリックすると、AJAX要求が行われたが、CHANGE_PASSWORDのものが遅れている、それがクリックされた後、update_profileがクリックされたときに、update_profileフォームが表示されているが、その後ときCHANGE_PASSWORD形に置き換えられますそれは完了です。

別のリストアイテムをクリックしたときに、最初のAJAXリクエストをキャンセルするにはどうすればよいですか?

+0

私は以前の排出が 'flatMap'を' flatMapLatest'に変更することによって最新のものを置き換えるのを防ぐことができました。 AJAXリクエストは引き続き行われます。 – nonybrighto

+1

'Rx.Observable.fromEvent'コンストラクタを参照してコードを簡素化することをお勧めします –

+0

うん。' create'を 'fromEvent'で置き換えます。 – nonybrighto

答えて

1

新しいエミッションが生成されたときに、前のストリーム(あなたのAjaxコール)の購読を取り消すswitchMapを使用できます。

そう言われています。約束のAjaxバージョンを使用しているので、そのリクエストをキャンセルする方法はありません。したがって、switchMapがキャンセルのフックを提供しても(unsubscribe)、約束はそれに作用しません。

ObservableバージョンにはRx.Observable.ajaxを使用できます。完了する前に退会すると、この通話は中止されます。 AFAIKはDOMに依存しているので、nodejs環境では、非DOM環境で動作しているときにxhrxhr2に置き換えてuniversal Ajax npm packageを使用できます。

+0

お返事ありがとうございました。私は 'switchMap'部分を見つけました。 'Rx.Observable.ajax'をチェックします。それは私が実際に必要なものです! – nonybrighto

関連する問題