2016-04-14 81 views
0

嗨我想了解承諾與Ajax調用一起工作的方式。 我想發送一個簡單的Ajax調用到特定的終點,但我真的與代碼語法混淆。這裏是我的代碼:Ember.RSVP.Promise with AJAX call

代碼的目的是使用戶的會話無效。首先,客戶端應該向註銷端點發送ajax調用,以提供用戶的令牌,然後如果服務器成功響應,我們調用invalidate()方法來清除客戶端的用戶數據。

import Ember from 'ember'; 

export default Ember.Controller.extend({ 
    session: Ember.inject.service('session'), 

    actions: { 
     invalidateSession() { 
     const url = "http://namespace/logout/"; 
     let logoutRequest = new Ember.RSVP.Promise(function(r,e){ 
      r(this.ajax(url, "PUT", {auth_token});) 
     }, 
     if (logoutRequest) { 
      this.get('session').invalidate(); 
     } 
     } 
    } 
}); 

我知道我的代碼不工作,但我不能把它放在一起......

+0

不'ajax(...)'已經返回一個承諾?不需要在它周圍放置'Promise'構造函數! – Bergi

+0

另外,你似乎有一個問題[在你的回調中使用'this'](http://stackoverflow.com/q/20279484/1048572)(這也可以通過省略'Promise'調用來解決) – Bergi

+0

你們倆是絕對正確的!我認爲我應該使用Ember中的RSVP.Promise ... – Jack

回答

2

使用ember-ajax這應該工作:

ajax: Ember.inject.service(), 
.... 
actions: { 
invalidateSession(){ 
    return this.get('ajax').request('url_goes_here', { 
     method: 'PUT', 
     data: { 
     some: "additional data" 
     }, 
    }).then(function(success) { 
     // inform about successful logout, redirect... 
    }).catch(function(error) { 
     // handle or throw error 
    }); 
    } 
} 

更新 如果您想圍繞Promises進行包裝,請嘗試以下操作: ...

正如@locks提到的那樣,建議使用ember-ajax庫而不是使用原始的Ember.$.ajax()。由於this.get('ajax').request()返回承諾,因此不需要將其包裝在承諾中。但是,如果您只想註銷,我建議您查看ember-simple-auth庫(插件),該庫已經解決了將來可能需要的許多功能(登錄,註銷,失效,重定向登錄路線...)。

+1

使用'ember-ajax'服務優於'Ember。$。ajax'。 – locks

0

你不能使用this.ajaxfrom a callback那樣。但無論如何,這是不必要的,因爲當ajax(…)已經返回一個時,您不需要new Promise。所以,只是

invalidateSession() { 
    const url = "http://namespace/logout/"; 
    let logoutRequestPromise = this.ajax(url, "PUT", {auth_token}); 
    return logoutRequestPromise.then((logoutRequestResult) => { 
     if (…) { 
      this.get('session').invalidate(); 
     } 
    }); 
}