AngularJS: 从内部返回一个承诺。然后?
AngularJS: Returning a promise from within .then?
我有一个用户服务。我想创建一个利用我构建的另一个服务的方法。此服务有两种方法。 getUser()
和 getCurrentUser()
。 getCurrentUser()
利用获取UID的注入服务。它使用 returned UID to 运行 getUser()
方法。我的问题是我无法获得 getCurrentUser()
到 return 第二层承诺。
这个问题有点难解释。这是代码...
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;
}
});
把承诺串起来,但不要忘记把拒绝也串起来...
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
服务。
作为,您也可以通过抛出错误而不是使用$q.reject
来拒绝承诺,例如
throw response;
这里的问题是当函数 getCurrentUser
被调用时,它立即 return 一个 undefined
变量。这是因为服务是异步的,并且在服务收到响应时,函数调用已经 returned 了一个 undefined
变量。为了防止这种情况,您可以在 loginService
.
中添加 return
调用
对于从成功回调中 return 一个 promise 的异步函数,你必须从作为 promise 对象的回调中 return 然后从主函数中 return为了向调用者提供承诺。
试试这个。
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);
}
);
}
});
我有一个用户服务。我想创建一个利用我构建的另一个服务的方法。此服务有两种方法。 getUser()
和 getCurrentUser()
。 getCurrentUser()
利用获取UID的注入服务。它使用 returned UID to 运行 getUser()
方法。我的问题是我无法获得 getCurrentUser()
到 return 第二层承诺。
这个问题有点难解释。这是代码...
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;
}
});
把承诺串起来,但不要忘记把拒绝也串起来...
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
服务。
作为$q.reject
来拒绝承诺,例如
throw response;
这里的问题是当函数 getCurrentUser
被调用时,它立即 return 一个 undefined
变量。这是因为服务是异步的,并且在服务收到响应时,函数调用已经 returned 了一个 undefined
变量。为了防止这种情况,您可以在 loginService
.
return
调用
对于从成功回调中 return 一个 promise 的异步函数,你必须从作为 promise 对象的回调中 return 然后从主函数中 return为了向调用者提供承诺。
试试这个。
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);
}
);
}
});