2017-04-18 40 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函數的原因以及何時使用它。問題解決了。

相關問題