2016-04-14 3 views
0

Привет Я пытаюсь понять, как обещают работу вместе с вызовами Ajax. Я хочу отправить простой вызов Ajax в определенную конечную точку, но я действительно смущен синтаксисом кода. Вот мой код:Ember.RSVP.Promise с вызовом 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

Не 'ajax (...)' уже возвращает обещание? Не нужно создавать вокруг него конструктор 'Promise'! – Bergi

+0

Кроме того, у вас, кажется, есть проблема [с 'this' в вашем обратном вызове] (http://stackoverflow.com/q/20279484/1048572) (который также решается путем упущения вызова' Promise') – Bergi

+0

Вы оба абсолютно правы! Я думал, что я должен использовать RSVP.Promise в Ember ... – 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 
    }); 
    } 
} 

Update: Если вы хотите обернуть его вокруг обещаний, попробуйте следующее: ...

Как указано в @locks, рекомендуется использовать библиотеку ember-ajax вместо использования raw Ember.$.ajax(). Поскольку this.get('ajax').request() возвращает обещание, нет необходимости обертывать его обещаниями.

Однако, если все, что вы хотите сделать, это выйти из системы, я рекомендую вам взглянуть на библиотеку (аддон) ember-simple-auth, которая уже разрешила многие функции, которые могут вам понадобиться в будущем (логин, выход из системы, аннулирование, перенаправление для входа в систему) маршрут ...).

+1

Использование 'ember-ajax' сервиса предпочтительнее' Ember. $. Ajax'. – locks

0

Вы не можете использовать this.ajaxfrom a callback вот так. Но это все равно, так как вам не нужен 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(); 
     } 
    }); 
} 
Смежные вопросы