2016-08-31 3 views
4

У меня есть сервис для пользователей. Я хотел бы создать метод, который использует другую службу, которую я создал. На этой службе есть два метода. getUser() и getCurrentUser(). getCurrentUser() использует введенную услугу, которая получает UID. Он использует возвращаемый UID для запуска метода getUser(). Моя проблема в том, что я не могу получить getCurrentUser(), чтобы вернуть обещание второго уровня.AngularJS: Возвращение обещания изнутри.

Этот вопрос немного сложно объяснить. Вот код ...

svs.service("usersService", function($rootScope, $http, loginService, alertBoxService) { 
    var self = this; 
    self.getUser = function(identifier, column) { 
    if (typeof(column) === 'undefined') column = "uid"; 
    return $http.get($rootScope.api + "/getUser/" + identifier + "/" + column); 
    } 
    self.getCurrentUser = function() { 
    var currentUserPromise; 
    loginService.getCurrentUid().then(
     function(response) { 
     if (response.data === "false") { 
      alertBoxService.trigger($rootScope.unexpectedApiResponse); 
     } else { 
      console.log(self.getUser(response.data)); 
      currentUserPromise = self.getUser(response.data); 
     } 
     }, function(response) { 
     alertBoxService.trigger($rootScope.asyncFailed); 
     } 
    ); 
    return currentUserPromise; 
    } 
}); 
+0

[Да, конечно] (http://stackoverflow.com/q/23667086/1048572). Но вам не нужна эта переменная! – Bergi

ответ

2

Chain обещание, но не забудьте цепи отказов тоже ...

self.getCurrentUser = function() { 
    return loginService.getCurrentUid().then(function(response) { 
     if (response.data === 'false') { 
      alertBoxService.trigger($rootScope.unexpectedApiResponse); 
      return $q.reject(response); // convert into a rejection 
     } 
     return self.getUser(response.data); // chain the promise resolution 
    }, function(response) { 
     alertBoxService.trigger($rootScope.asyncFailed); 
     return $q.reject(response); // chain the rejections 
    }); 
} 

Вам нужно впрыскивать $q службы конечно.


Как Bergi kindly pointed out, вы также можете отказаться от обещания, бросая ошибку вместо того, чтобы использовать $q.reject, например

throw response; 
+0

Возможно, вы захотите выделить первый добавленный 'return', он легко забыт теми, кто узнает о' then' – Bergi

+0

Что мы делаем с '$ q' здесь? – Allenph

+1

Вместо использования '$ q.reject' вы можете просто перевернуть ошибку. – Bergi

0

Проблема здесь состоит в том, что, когда функция getCurrentUser вызывается, она немедленно возвращает undefined переменная. Это связано с тем, что служба является асинхронной, и к моменту получения ответа службой вызов функции уже возвратил переменную undefined. Чтобы предотвратить это, вы можете добавить вызов return внутри loginService.

0

Для функции async, чтобы вернуть обещание изнутри обратного вызова успеха, вы должны вернуться из обратного вызова, который является объектом обещания, а затем вернуться из основной функции, чтобы обеспечить обещание вызывающего.

Попробуйте это.

svs.service("usersService", function($rootScope, $http, loginService, alertBoxService) { 
    var self = this; 
    self.getUser = function(identifier, column) { 
    if (typeof(column) === 'undefined') column = "uid"; 
    return $http.get($rootScope.api + "/getUser/" + identifier + "/" + column); 
    } 
    self.getCurrentUser = function() { 
    return loginService.getCurrentUid().then(
     function(response) { 
     if (response.data === "false") { 
      alertBoxService.trigger($rootScope.unexpectedApiResponse); 
     } else { 
      console.log(self.getUser(response.data)); 
      return self.getUser(response.data); 
     } 
     }, function(response) { 
     alertBoxService.trigger($rootScope.asyncFailed); 
     } 
    ); 
    } 
}); 
Смежные вопросы