2013-08-16 21 views
0

我們必須從API中獲取一些信息,這些信息是我們在客戶端計算的哈希值,但是需要花費相當長的時間才能完成。我們還沒有能夠與角度週期同步,我們可以做的最多的是設置一個超時來計算散列,但儘管我們現在得到了散列並獲得了信息,但是這會打破角度週期,我們可以使用它。如何將工廠連接到花費太多時間的服務?

我們是角(1.0.7)相當新的,我們知道,我們失去了一些東西,在這個問題上的任何幫助將appriaceted

更新忽略了一些明顯的部分代碼,我想,請讓我知道如果不是這樣。

https://code.google.com/p/javascript-bcrypt/和依賴正確加載,所以我們創建了一個計算哈希服務(還有一兩件事,這是需要的哈希僅一次計算)

.service('hashSrv', function(SALT, $q, $timeout) { 
    var bcrypt, token = '', secure = '', deferred = $q.defer(); 

    bcrypt = new bCrypt(); 
    token = Base64.encode("Sometoken"); 

    return { 
     generate: function() { 
      bcrypt.hashpw(token, SALT, function(hash) { 
       secure = hash; 
      }); 
     }, 
     getSecure: function() { 
      return secure; 
     }, 
     getToken: function() { 
      return token; 
     }, 
     getData: function() { 
      return { 
       'token': token, 
       'secure': secure 
      } 
     } 
    } 
}) 

這裏是我們的工廠資源:

.factory('InfoSrv', function ($http, RESOURCE_URL, HashSrv, $timeout) { 
    return $timeout(function() { 
     $http({method: 'GET', url: 'RESOURCE_URL?token=' + HashSrv.getToken() + '&secure=' + HashSrv.getSecure()}) 
     .success(function(response, data, status, headers, config) { 
      //Here we have the correct response 
     }) 
     .error(function(response, data, status, headers, config) { 
      //Check if something bad happens 
     }); 
    }, 200); 
}) 

最後,我們試圖阿勒在我們的控制器使用它

.controller('DataCtrl', 
    ['$scope', 'InfoSrv', 
    function ($scope, InfoSrv) { 
     $scope.user.basicInformation = $scope.getBasicInfo(); 
     //Here we can get the info :(
    } 
]) 
+0

什麼是計算散列的邏輯?這聽起來像一個非常快速的過程。 – zsong

+0

我們正在使用https://code.google.com/p/javascript-bcrypt/ – raulricardo21

+0

應該在您要調用crypt函數的地方發佈一些角碼,以便我們可以更好地幫助您。但最有可能的是你需要調用$ scope。$ apply();讓角度知道您在角度摘要週期之外計算出的任何更新。 – DerekR

回答

1

$ timeout服務返回一個promise,並且promise解析的值是在傳遞給$ timeout的函數內返回的值。在你的情況下,你不會在$超時內返回任何東西。

我不知道爲什麼你需要$超時要麼。你可以返回$ http(),這也將返回承諾。然後將您的成功,錯誤方法移出服務。

+0

因爲哈希需要一些時間來計算 – raulricardo21

0

在hashSrv,generate()應該返回延期承諾

generate: function() { 
     bcrypt.hashpw(token, SALT, function(hash) { 
      secure = hash; 
      deferred.resolve(hash); 
     }); 
     return deferred.promise; 
} 

工廠應返回一個promise這樣的:

.factory('InfoSrv', function ($http, RESOURCE_URL, HashSrv, $timeout) { 
    return { 
     getBasicInfo: function() { 
      var promise = $http({ 
       method: 'GET', 
       url: 'RESOURCE_URL?token=' + HashSrv.getToken() + '&secure=' + HashSrv.getSecure() 
      }).success(function (response, data, status, headers, config) { 
       return data; 
      }).error(function (response, data, status, headers, config) { 
       //Check if something bad happens 
      }); 
      return promise; 
     }; 
    } 
}); 

而且你可以在你的控制器消費這樣的服務:

.controller('DataCtrl', ['$scope', 'InfoSrv', 'hashSrv', function ($scope, InfoSrv, hashSrv) { 
    hashSrv.generate().then(function (hash) { 
     InfoSrv.getBasicInfo().then(function (data) { 
      $scope.user.basicInformation = data; 
     }) 
    }) 
}]) 
+0

嗨這裏是的東西,請求是在我們得到哈希之前執行:( – raulricardo21

+0

@ raulricardo21我更新了generate()和控制器。我沒有測試代碼,你 – zsong

+0

Hi @sza,請求沒有被執行,但散列被計算出來 – raulricardo21

相關問題