【发布时间】:2013-03-14 07:23:27
【问题描述】:
我看到了一些使用 promises 访问 FB Graph API 的 Facebook 登录服务示例。
示例 #1:
this.api = function(item) {
var deferred = $q.defer();
if (item) {
facebook.FB.api('/' + item, function (result) {
$rootScope.$apply(function () {
if (angular.isUndefined(result.error)) {
deferred.resolve(result);
} else {
deferred.reject(result.error);
}
});
});
}
return deferred.promise;
}
以及在收到响应时使用"$scope.$digest() // Manual scope evaluation" 的服务
示例 #2:
angular.module('HomePageModule', []).factory('facebookConnect', function() {
return new function() {
this.askFacebookForAuthentication = function(fail, success) {
FB.login(function(response) {
if (response.authResponse) {
FB.api('/me', success);
} else {
fail('User cancelled login or did not fully authorize.');
}
});
}
}
});
function ConnectCtrl(facebookConnect, $scope, $resource) {
$scope.user = {}
$scope.error = null;
$scope.registerWithFacebook = function() {
facebookConnect.askFacebookForAuthentication(
function(reason) { // fail
$scope.error = reason;
}, function(user) { // success
$scope.user = user
$scope.$digest() // Manual scope evaluation
});
}
}
问题是:
- 以上示例中的区别是什么?
- 使用$q服务的理由和案例有哪些?
- 它是如何工作的?
【问题讨论】:
-
听起来你应该阅读一下什么是承诺,以及为什么要普遍使用它们……它们不是 Angular 独有的,而且有很多可用的材料
-
@charlietfl,说得好,但我希望得到一个复杂的答案,涵盖两者:为什么它们被普遍使用以及如何在 Angular 中使用它。感谢您的建议
标签: angularjs deferred promise