2013-05-01 24 views
16

我有一個承諾,我綁定在我的用戶界面。當承諾解決並且UI元素呈現時,我可以點擊該UI元素。在我處理點擊的控制器代碼中,我想根據承諾的價值行事。在我的角碼中,我已經知道承諾已經解決了,但是當我想要得到它的價值時,它仍然是一個承諾。如何獲得已解決的承諾價值?

什麼是最好的方式來獲得承諾的價值......因爲我知道它一定已經解決了?

回答

21

承諾總是承諾 - 這就是他們應該的。雖然可以將承諾直接綁定到視圖上,但我通常不鼓勵這種做法,因爲它缺乏透明度並可能導致閃爍。一個更好的解決辦法是在then呼叫分配一個範圍值:

myService.then(function(val) { 
    $scope.val = val; 
}); 

$scope.val準備好,它總是可以直接視爲值 - 因爲它是。

也就是說,如果你想直接做承諾分配,你只需要把它看作一個承諾;也就是說,您需要撥打promise.then(function() { ... });。這似乎是一個不便,但它實際上是承諾有多強大的證明。

如果您希望獲得更多關於承諾的信息,我爲他們提供了最近的Google+環聊(並提供了代碼示例),其中介紹了AngularJS中承諾的優點,常見用途和最佳做法:AngularJS Hangout -- Promises, Promises Promises, Promises。儘管我的頭腦裏沒有時間碼,但我們專門解決了永無止境的諾言鏈的想法。

希望這會有所幫助!

+1

謝謝!我接受了你的建議,並在'then'函數中分配了我的範圍變量。從那裏一切順利。但我很好奇,如果有特定情況下,直接綁定到承諾是有意義的...因爲角度提供了這種功能。 – sthomps 2013-05-01 18:43:24

+0

我不知道有這種情況;我認爲功能主要是爲了方便。但也許別人有意見...... – 2013-05-01 19:10:23

+0

給出答案「你不想這樣做」並不總是有幫助的。我的情況我肯定是想在我調試時做這件事,我不知道如何獲得承諾的價值。它肯定有可能以某種方式。 – Machisuji 2015-04-17 07:47:04

0

有些棘手的理解是,你可能會認爲如果Promise尚未完全填充,那麼也許如果我等一下,我可以再次測試,看看現在它是否有價值。但這是不可能的,因爲正如在MDN上解釋的那樣:

「在JavaScript事件循環的當前運行完成之前,將永遠不會調用回調函數。」

所以只要你當前啓動的功能正在運行,Promise不能被全部填滿。它在事件循環的當前運行期間沒有「值」。 「承諾」的意思是「我承諾可以在NEXT事件循環運行期間給你」。

你可以將這個承諾保存到一個全局變量中,然後當用戶點擊瀏覽器中的一個按鈕時,一個新的事件循環通過運行你可以將另一個「when()」放到承諾上的事件處理程序開始如果承諾在那個時候被解決,那麼新的when函數將獲取它的值作爲參數並將其保存到一個變量中,以便讀取它。無需將其寫入控制檯,以查看它是否在那裏。

這對我來說是棘手的部分,我認爲是的,我確定我可以讓Promise寫入控制檯,但是我無法從控制檯讀取數據,那麼我怎麼才能將該值存入我的程序的其餘部分?回答:等到當前的事件循環結束,然後你可以。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises

相關問題