2013-08-24 94 views
21

我剛剛實現了我的第一個函數,該函數返回基於AngularJS中另一個承諾的承諾,並且它工作正常。但在我決定只是之前,我花了2個小時閱讀並試圖理解承諾背後的概念。我想如果我能寫一段簡單的代碼來模擬承諾的工作方式,那麼我就能夠從概念上理解它,而不是不知道它是如何工作的。我無法編寫該代碼。承諾如何在JavaScript中起作用?

那麼,有人可以請示例在香草JavaScript中承諾如何工作?

+2

只是爲了澄清您的期望...... promise是您實現的東西,而不是vanilla JavaScript中的語言構造。檢查了這一點:http://www.benlesh.com/2012/09/javascript-promises-promises.html – Brad

+5

這個問題沒有理由應該被關閉太寬泛。這是一個非常明確而具體的問題。 – Brad

回答

30

承諾基本上是一個有兩種方法的對象。一種方法是定義要做什麼,一個是告訴什麼時候去做。它必須是可以調用任何順序的兩個方法,所以對象需要跟蹤其中一個被稱爲:

​​

您可以先定義動作,然後觸發它:

promise.done(function(){ alert('done'); }); 
promise.callDone(); 

你可以先觸發動作,然後把它定義:

promise.callDone(); 
promise.done(function(){ alert('done'); }); 

演示:http://jsfiddle.net/EvN9P/

當您在異步函數中使用承諾時,該函數將創建空承諾,保留對其的引用,並返回引用。處理異步響應的代碼將觸發promise中的操作,調用異步函數的代碼將定義操作。

由於這兩者中的任何一個都可能以任何順序發生,因此調用異步函數的代碼可以掛在promise上並隨時定義行爲。

-1

爲了簡單理解Javascript中的承諾。 你可以參考下面的例子。只需複製粘貼到一個新的PHP/HTML文件並運行。

<!DOCTYPE HTML> 
<html> 
<head> 
<script type="text/javascript"> 

function test(n){ 
    alert('input:'+n); 

    var promise = new Promise(function(fulfill, reject) {   
     /*put your condition here */ 
     if(n) { 
     fulfill("Inside If! match found"); 
     } 
     else { 
     reject(Error("It broke")); 
     } 
    }); 
    promise.then(function(result) { 
     alert(result); // "Inside If! match found" 
    }, function(err) { 
     alert(err); // Error: "It broke" 
    }); 
} 

</script> 

</head> 
<body> 
<input type="button" onclick="test(1);" value="Test"/> 

</body> 
</html> 
  1. 點擊測試按鈕,
  2. 這將創造新的承諾,
  3. 如果條件將是真正的履行它的響應,
  4. promise.then打來電話,基於履行它將打印結果
  5. 如果拒收承諾,則返回錯誤消息。
0

大概承諾使用的最簡單的例子看起來像這樣:

var method1 = (addings = '') => { 
    return new Promise(resolve => { 
    console.log('method1' + addings) 
    resolve(addings + '_adding1'); 
    }); 
} 
var method2 = (addings = '') => { 
    return new Promise(resolve => { 
    console.log('method2' + addings) 
    resolve(addings + '_adding2'); 
    }); 
} 

method1().then(method2).then(method1).then(method2); 
// result: 
// method1    
// method2_adding1  
// method1_adding1_adding2 
// method2_adding1_adding2_adding1 

這是基礎的基礎。有了它,你可以用廢品實驗:

var method1 = (addings = '*') => { 
    return new Promise((resolve, reject) => { 
    console.log('method1' + addings) 
    resolve(addings + '_adding1'); 
    }); 
} 
var method2 = (addings = '*') => { 
    return new Promise((resolve, reject) => { 
    console.log('method2' + addings) 
    reject(); 
    }); 
} 
var errorMethod =() => { 
    console.log('errorMethod') 
} 
method1() 
.then(method2, errorMethod) 
.then(method1, errorMethod) 
.then(method2, errorMethod) 
.then(method1, errorMethod) 
.then(method2, errorMethod); 
// result: 
// method1*   
// method2*_adding1 
// errorMethod 
// method2* 
// errorMethod 
// method2* 

正如我們看到的,在失敗誤差函數的情況下被解僱(這是永遠的then第二個參數)和鏈那麼接下來的函數沒有給出解僱論據。

對於高級知識我邀請你here