Выполнение кода асинхронно в JavaScript

0

В настоящее время я изучаю, как использовать Angular.js, и пытался написать собственный код аутентификации с использованием REST-подобного API. Ниже приведен код моей службы аутентификации.

Проблема с моей функцией signIn том, что она всегда возвращает false, даже когда мой api возвращает HTTP 200. Через некоторое время я понял, что это связано с синхронным характером javascript, который return response; оператор выполняется перед response = res.data.key; выражение.

Я не знаю, как выполнить оператор return после завершения назначения (если ответ HTTP 200). Как мне это сделать?

angular.module('app').factory('auth', ['Base64', '$http', function(Base64, $http) {
    return {
        signIn: function(email, password) {
            var response = false;
            var encoded = Base64.encode(email + ':' + password);
            $http.defaults.headers.common.Authorization = 'Basic ' + encoded;
            $http.post('api/v1/sign_in', {}).then(function(res) {
                if (res.status == 200) {
                    response = res.data.key;
                }
            });
            return response;
        }    
    }
}]);
Теги:
mean-stack

2 ответа

2
Лучший ответ

Используйте $q.defer():

angular.module('app').factory('auth', ['Base64', '$http', '$q', function(Base64, $http, '$q') {
    return {
        signIn: function(email, password) {
            var response = false;
            // You create a deferred object
            // that will return a promise
            // when you get the response, you either :
            // - resolve the promise with result
            // - reject the promise with an error
            var def = $q.defer();
            var encoded = Base64.encode(email + ':' + password);
            $http.defaults.headers.common.Authorization = 'Basic ' + encoded;
            $http.post('api/v1/sign_in', {}).then(function(res) {
                if (res.status == 200) {
                    response = res.data.key;
                    // success: we resolve the promise
                    def.resolve(response);
                } else {
                  // failure: we reject the promise
                  def.reject(res.status);
                }
            });
            // You return the promise object that will wait 
            // until the promise is resolved
            return def.promise;
        }    
    }
}]);

Теперь вы можете сделать:

auth.signIn().then(function(key) {
    // signin successful
    // do something with key
}).catch(function(err) {
    // signin failed :(
    // do something with err
}).finally(function() {
    // you could do something in case of failure and success
})
2

Вам нужно узнать о обещаниях: верните обещание из сообщения http.

Это может помочь

Ещё вопросы

Сообщество Overcoder
Наверх
Меню