Как вернуть разрешенное обещание от службы AngularJS с использованием $q?
Мой сервис:
myApp.service('userService', [
'$http', '$q', '$rootScope', '$location', function($http, $q, $rootScope, $location) {
var deferred;
deferred = $q.defer();
this.initialized = deferred.promise;
this.user = {
access: false
};
this.isAuthenticated = function() {
this.user = {
first_name: 'First',
last_name: 'Last',
email: '[email protected]',
access: 'institution'
};
return deferred.resolve();
};
}
]);
Я вызываю это в файле config
через:
myApp.run([
'$rootScope', 'userService', function($rootScope, userService) {
return userService.isAuthenticated().then(function(response) {
if (response.data.user) {
return $rootScope.$broadcast('login', response.data);
} else {
return userService.logout();
}
});
}
]);
Однако он жалуется, что then
не является функцией. Разве я не вернусь к разрешенному обещанию?
Ответы
Ответ 1
Из вашего метода обслуживания:
function serviceMethod() {
return $timeout(function() {
return {
property: 'value'
};
}, 1000);
}
И в вашем контроллере:
serviceName
.serviceMethod()
.then(function(data){
//handle the success condition here
var x = data.property
});
Ответ 2
Как просто вернуть обещание с предварительным разрешением в Angular
Разрешенные обещания:
return $q.when( someValue ); // angular 1.2+
return $q.resolve( someValue ); // angular 1.4+, alias to `when` to match ES6
Отклонено обещание:
return $q.reject( someValue );
Ответ 3
Верните свое обещание, верните отложенное.
Это API-интерфейс обещания, который имеет метод "then".
https://docs.angularjs.org/api/ng/service/$q
Решение о вызове не возвращает обещание, которое только сигнализирует
обещают, что обещание будет разрешено, чтобы оно могло выполнить логику "then".
Базовый шаблон следующим образом, полоскание и повторение
http://plnkr.co/edit/fJmmEP5xOrEMfLvLWy1h?p=preview
<!DOCTYPE html>
<html>
<head>
<script data-require="[email protected]*" data-semver="1.3.0-beta.5"
src="https://code.angularjs.org/1.3.0-beta.5/angular.js"></script>
<link rel="stylesheet" href="style.css" />
<script src="script.js"></script>
</head>
<body>
<div ng-controller="test">
<button ng-click="test()">test</button>
</div>
<script>
var app = angular.module("app",[]);
app.controller("test",function($scope,$q){
$scope.$test = function(){
var deferred = $q.defer();
deferred.resolve("Hi");
return deferred.promise;
};
$scope.test=function(){
$scope.$test()
.then(function(data){
console.log(data);
});
}
});
angular.bootstrap(document,["app"]);
</script>
Ответ 4
Вот правильный код для вашего сервиса:
myApp.service('userService', [
'$http', '$q', '$rootScope', '$location', function($http, $q, $rootScope, $location) {
var user = {
access: false
};
var me = this;
this.initialized = false;
this.isAuthenticated = function() {
var deferred = $q.defer();
user = {
first_name: 'First',
last_name: 'Last',
email: '[email protected]',
access: 'institution'
};
deferred.resolve(user);
me.initialized = true;
return deferred.promise;
};
}
]);
Затем вы должны соответствующим образом согласовать контроллер:
myApp.run([
'$rootScope', 'userService', function($rootScope, userService) {
return userService.isAuthenticated().then(function(user) {
if (user) {
// You have access to the object you passed in the service, not to the response.
// You should either put response.data on the user or use a different property.
return $rootScope.$broadcast('login', user.email);
} else {
return userService.logout();
}
});
}
]);
Несколько пунктов, чтобы отметить об услуге:
-
Выставлять в службе только то, что должно быть открыто. Пользователь должен храниться внутри и получать доступ только с помощью геттеров.
-
Когда в функциях используется "я", которое является службой, чтобы избежать ошибок в этом случае с помощью javascript.
-
Я догадался, что означало инициализацию, не стесняйтесь исправить меня, если я ошибаюсь.
Ответ 5
Чтобы вернуть обещанное обещание, вы можете использовать:
return $q.defer().resolve();
Если вам нужно что-то решить или вернуть данные:
return $q.defer().resolve(function(){
var data;
return data;
});
Ответ 6
Для более короткого JavaScript-кода используйте это:
myApp.service('userService', [
'$q', function($q) {
this.initialized = $q.when();
this.user = {
access: false
};
this.isAuthenticated = function() {
this.user = {
first_name: 'First',
last_name: 'Last',
email: 'email[email protected]',
access: 'institution'
};
return this.initialized;
};
}
]);
Вы знаете, что потеряете привязку к userService.user, перезаписав ее новым объектом, а не устанавливая только свойства объектов?
Вот что я имею в виду как пример моего примера кода plnkr.co(Рабочий пример:
http://plnkr.co/edit/zXVcmRKT1TmiBCDL4GsC?p=preview):
angular.module('myApp', []).service('userService', [
'$http', '$q', '$rootScope', '$location', function ($http, $q, $rootScope, $location) {
this.initialized = $q.when(null);
this.user = {
access: false
};
this.isAuthenticated = function () {
this.user.first_name = 'First';
this.user.last_name = 'Last';
this.user.email = '[email protected]';
this.user.access = 'institution';
return this.initialized;
};
}]);
angular.module('myApp').controller('myCtrl', ['$scope', 'userService', function ($scope, userService) {
$scope.user = userService.user;
$scope.callUserService = function () {
userService.isAuthenticated().then(function () {
$scope.thencalled = true;
});
};
}]);
Ответ 7
Попробуйте следующее:
myApp.service('userService', [
'$http', '$q', '$rootScope', '$location', function($http, $q, $rootScope, $location) {
var deferred= $q.defer();
this.user = {
access: false
};
try
{
this.isAuthenticated = function() {
this.user = {
first_name: 'First',
last_name: 'Last',
email: '[email protected]',
access: 'institution'
};
deferred.resolve();
};
}
catch
{
deferred.reject();
}
return deferred.promise;
]);