2017-02-25 67 views
3

我開始用角承諾的語法如下解決我的API調用:

$scope.module = moduleFactory.get({id: $stateParams.id}) 
    .$promise.then(function(response){ 
     $scope.module = response; 
    } 

現在,我曾經遇到過一個情況我有把多個承諾在for循環中,一旦所有的執行一些代碼for循環中的承諾已經解決。我一直在努力尋找如何使用$ promise語法來做到這一點,但是互聯網上的大多數消息來源都是關於$ q的。我對開發工作很陌生,並且發現在這兩個概念($ q和$ promise)之間混雜起來讓人感到非常困惑。請你們好人們:首先,向我解釋$ promise和$ q之間的區別;第二,如果我決定使用$ q來解決上述的問題,是否意味着我將不得不重寫使用$ promise的代碼,以便使它像$ q.all()那樣可鏈接?

+0

簡短的回答:'$ promise'是對某些操作的返回值返回該操作的結果承諾的屬性。 '$ q'是一個服務,它提供了一些像'$ q.all'和'$ q.resolve'這樣的創建和操作機制。 – JLRishe

回答

3

你可以通過調用$q構建角承諾:

let promise = $q(function(resolve, reject) { ... }; 

,或者如果你只是想要一個承諾,立即決定:

let promise = $q.resolve(somevalue); 

也有使用$q.defer()構建一個較舊的方式一個延遲的對象,並返回它的.promise屬性,但你應該避免做這樣的說法,並認爲它只是爲了向後兼容。

創建新承諾的最終方法是在現有承諾上致電.then()(或.catch())。

.$promise屬性僅僅是由上述機制之一通過$resource服務或通過遵循相同模式的某些東西創建的承諾。

一旦你有一些承諾,您可以他們的東西都變成一個數組,並使用$q.all()等待他們全部完成,或爲一個拒絕。或者,如果你想要的東西通過執行與先前承諾的.then()每個步驟依次發生,你可以把它們連在一起:

let promise = $q.resolve(); 
for(... something ...) { 
    promise = promise.then(() => { ... next step here ...}); 
} 
promise.then(() => { ... runs when everything completed ...}); 

$q.all()並行開始其關閉,將執行在所有序列。有時候你想要一個,有時其他:

let promises = []; 
for(... something ...) { 
    promises.push(somethingThatReturnsAPromise()); 
} 
$q.all(promises).then(() => { ... runs when everything completed ...}); 
+0

感謝您的回答:) –

4

$promise是由$resource Service類類型的操作方法返回的對象的屬性。

重要的是要認識到,調用$resource對象方法立即返回一個空引用(對象或數組取決於isArray)是重要的。一旦從服務器返回數據,現有參考將填入實際數據。

資源實例和收藏有這些附加屬性:

  • $promise:創建此實例或收集原始服務器交互的承諾。

    成功時,promise使用相同的資源實例或集合對象進行解析,並使用來自服務器的數據進行更新。這使得在resolve section of $routeProvider.when()中使用它很容易推遲查看渲染,直到加載資源。

    失敗時,承諾將被拒絕,並且http response對象沒有資源屬性。

--AngularJS $resource Service API Reference


注:中的問題的示例代碼是多餘的和不必要的。

$scope.module = moduleFactory.get({id: $stateParams.id}) 
    .$promise.then(function(response){ 
     //REDUNDANT, not necessary 
     //$scope.module = response; 
    }); 

解決應對$範圍的分配不necesssary作爲$resource將自動填充時參考的結果來自於服務器。僅當代碼需要與結果一起使用時,才使用$promise屬性它們來自服務器。

要區分返回承諾的其他服務返回$resource Service對象的服務,請查找.then方法。如果對象有一個.then方法,這是一個承諾。如果它有$promise屬性,則它遵循ngResource模式。



必須顯而易見給你,但我用的數組$資源。$承諾的內線$q.all()和它的工作。

$q.all作品與來自任何來源的承諾。在內部,它使用$q.when到值或承諾(任何然後-能夠對象)轉換爲$q Service承諾。

在其他承諾庫中除all方法外,其他$q.all的設置除了處理數組外,還可用於具有承諾屬性的JavaScript對象。我們可以做出承諾的散列(關聯數組),並使用$q.all來解決它。

var resourceArray = resourceService.query(example); 

var hashPromise = resourceArray.$promise.then(function(rArray) { 
    promiseHash = {}; 
    angular.forEach(rArray,function (r) { 
     var item = resourceService.get(r.itemName); 
     promiseHash[r.itemName] = item.$promise; 
    }); 
    //RETURN q.all promise to chain 
    return $q.all(promiseHash); 
}); 

hashPromise.then(function (itemHash) { 
    console.log(itemHash); 
    //Do more work here 
}); 

上述示例創建由ITEMNAME與所有項被從$resource Service異步獲取的索引項的散列。

+0

這真的很有幫助。它對你來說一定很明顯,但是我使用$ resource的數組。$ promise在$ q.all()內部並且工作正常。你的回答幫助我加強了我的概念理解。謝謝:) –

相關問題