您好我正在尝试理解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();
}
}
}
});
我知道我的代码不起作用,但我无法将它们放在一起......
答案 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();
}
});
}