2016-03-30 2 views
0

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

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

Я не знаю, как выполнить оператор возврата после завершения назначения (если ответ 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; 
     }  
    } 
}]); 

ответ

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.

This may help

Смежные вопросы