Ember.RSVP.Promise with AJAX call

时间:2016-04-14 08:41:24

标签: javascript ajax ember.js

您好我正在尝试理解promises与Ajax调用一起工作的方式。 我想向某个端点发送一个简单的Ajax调用,但我真的对代码语法感到困惑。这是我的代码:

代码的目的是使用户的会话无效。首先,客户端应该向提供用户令牌的注销端点发送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();
        }
      }
    }
});

我知道我的代码不起作用,但我无法将它们放在一起......

2 个答案:

答案 0 :(得分: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 :(得分:0)

您不能像这样使用var OpenLayers = class { static Layer = class { static Markers = class {} } } from a callback。但无论如何,这是不必要的,因为当this.ajax已经返回时,new Promise不需要ajax(…)。只做

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