2017-04-18 74 views
0

我正在为Umbraco编写一个AngularJS插件并创建了一个简单的视图,控制器和服务。但由于某种原因,我的承诺需要一段时间才能解决。

我已经使用内置的$ q服务来创建并返回我的承诺,我已经注销了我的变量,并可以看到异步服务何时结束,但是与调用的解析函数之间存在明显的时间差。

我已经发现承诺看起来像它正在等待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

+0

定义*“明显的时差”*。请注意,角度版本非常陈旧 – charlietfl

+0

它会有所不同,但在第一个控制台日志之后,在解析功能执行之前,它可以长达10秒。 – StueyKent

回答

0

找到了一些时间后,重新审视这个问题我已经发现了承诺为什么这样做的原因渴望回应。

大多数端点可以在角使用$ HTTP服务可以达到,但GAPI使用它自己的方法,使请求,并由于角度生命周期它来调用$适用它提示的角度来是非常重要的更新任何绑定或观察者。

两个这里链接到文件和其他重要资源: https://code.angularjs.org/1.1.5/docs/api/ng.$rootScope.Scope#$apply http://jimhoskins.com/2012/12/17/angularjs-and-apply.html

这是烦人简单,只能在我缺乏角度的知识的指责。在我看来,这个承诺正在等待角色在解决承诺之前达到其生命周期中的某个点,而不是立即更新。用apply函数包装它可以解决这个问题。

$rootScope.$apply(function(){ 
    deferred.resolve(signedIn); 
}); 

对于那些有兴趣有许多步骤害得我诊断这个问题,包括:

  • 移动GAPI叫出了服务,并返回到控制器

    这没有任何效果,并且承诺还需要一段时间才能解决。

  • 换出GAPI呼吁建立的setTimeout

    同样,这没有任何效果,并承诺仍然需要一些时间来解决,但确实显示,这个问题没有直接关系GAPI。

  • 添加不同长度

    这多个下一个定时器,是下一个步骤,因为它证明了承诺被同时解决,即使它们应该是秒开。两个重要的发现出来了。与视图交互造成的承诺,以解决(某种生命周期的触发),并且有setTimeout的的角度版本,称为$超时

  • 阅读了为什么$超时存在

    这导致了解更多关于角度生命周期和$ apply函数的原因以及何时使用它。问题解决了。

相关问题