我正在为umbraco编写一个AngularJS插件,并创建了一个简单的视图,控制器和服务。但是由于某种原因,我的诺言是花一段时间才能解决。
我已经使用了Instoy $ Q服务来创建和返回我的诺言,我已经记录了我的变量,并且可以查看sync服务何时完成,但是该变量何时完成,但该变量与该函数之间存在明显的时间差,并且被称为"解决"功能。p>从那以后,我发现了诺言,好像正在等待umbracos getRemainingtimeout服务。
有人可以解释为什么会发生这种情况吗?
viewController.js
angular.module('umbraco')
.controller('JaywingAnalyticsHelper.ViewController', function ($scope, googleService) {
googleService.checkAuth().then(function (signedIn){
$scope.isAuthorised = signedIn;
console.log(signedIn);
});
});
googleservice.js
angular.module("umbraco")
.service('googleService', function ($q) {
var clientId = 'REMOVED_FOR_PRIVACY',
scopes = ['https://www.googleapis.com/auth/analytics.readonly'],
deferred = $q.defer();
this.checkAuth = function () {
gapi.load('auth2', function () {
gapi.auth2.init().then(function () {
var googleAuth = gapi.auth2.getAuthInstance();
var signedIn = googleAuth.isSignedIn.get();
console.log(signedIn);
deferred.resolve(signedIn);
}, function(){
deferred.reject(false);
});
});
return deferred.promise;
};
});
umbraco版本-7.5.12
角版-1.1.5
找到一些时间重新审视此问题后,我发现了为什么承诺需要这么长时间做出回应的原因。
可以通过使用$ HTTP服务在Angular内到达大多数端点应用提示Angular更新任何绑定或观察者。
这里的两个链接到文档和另一个很棒的资源:https://code.angularjs.org/1.1.5/docs/api/ng.qulrotscope.scope#jupplyhttp://jimhoskins.com/2012/12/17/angularjs-and-apply.html
这很简单,只能归咎于我缺乏角度知识。在我的情况下,承诺是等待Angular在解决诺言之前而不是立即更新的生命周期中达到其生命周期的某个点。将其包装在应用功能中解决此问题。
$rootScope.$apply(function(){
deferred.resolve(signedIn);
});
对于那些有兴趣的人,有许多步骤导致我诊断出此问题,包括:
将GAPI呼叫从服务中移出并返回控制器
这没有任何效果,诺言仍然需要一段时间才能解决。
交换GAPI呼叫SettieMout
再次没有任何效果,诺言仍然需要一段时间才能解决,但确实表明该问题与GAPI没有直接相关。
添加多个长度的多个settimeout
这是下一步,因为它证明了承诺即使应该相距秒钟,也是同时解决的。这两个重要发现。与视图的互动导致了解决的承诺(某种生命周期触发器(,并且有一个Antular版本的Settimeout称为$ timeout
阅读为什么$ timeout存在
这导致了有关角生命周期以及$应用功能的更多信息,为什么以及何时使用它。解决问题。