我剛剛實現了我的第一個函數,該函數返回基於AngularJS中另一個承諾的承諾,並且它工作正常。但在我決定只是之前,我花了2個小時閱讀並試圖理解承諾背後的概念。我想如果我能寫一段簡單的代碼來模擬承諾的工作方式,那麼我就能夠從概念上理解它,而不是不知道它是如何工作的。我無法編寫該代碼。承諾如何在JavaScript中起作用?
那麼,有人可以請示例在香草JavaScript中承諾如何工作?
我剛剛實現了我的第一個函數,該函數返回基於AngularJS中另一個承諾的承諾,並且它工作正常。但在我決定只是之前,我花了2個小時閱讀並試圖理解承諾背後的概念。我想如果我能寫一段簡單的代碼來模擬承諾的工作方式,那麼我就能夠從概念上理解它,而不是不知道它是如何工作的。我無法編寫該代碼。承諾如何在JavaScript中起作用?
那麼,有人可以請示例在香草JavaScript中承諾如何工作?
承諾基本上是一個有兩種方法的對象。一種方法是定義要做什麼,一個是告訴什麼時候去做。它必須是可以調用任何順序的兩個方法,所以對象需要跟蹤其中一個被稱爲:
您可以先定義動作,然後觸發它:
promise.done(function(){ alert('done'); });
promise.callDone();
你可以先觸發動作,然後把它定義:
promise.callDone();
promise.done(function(){ alert('done'); });
當您在異步函數中使用承諾時,該函數將創建空承諾,保留對其的引用,並返回引用。處理異步響應的代碼將觸發promise中的操作,調用異步函數的代碼將定義操作。
由於這兩者中的任何一個都可能以任何順序發生,因此調用異步函數的代碼可以掛在promise上並隨時定義行爲。
爲了簡單理解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>
大概承諾使用的最簡單的例子看起來像這樣:
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。
只是爲了澄清您的期望...... promise是您實現的東西,而不是vanilla JavaScript中的語言構造。檢查了這一點:http://www.benlesh.com/2012/09/javascript-promises-promises.html – Brad
這個問題沒有理由應該被關閉太寬泛。這是一個非常明確而具體的問題。 – Brad