學習Promise
理解 Promise
Promise 簡介:
一個 Promise 有3個狀態。他們分別是:
- Promise 是待定的(pending): 不確定當前任務是否滿足條件
- Promise 是已解決的(resolved):當前任務滿足條件
- Promise 是被拒絕的(rejected): 當前任務不滿足條件
建立一個 Promise
/* ES5 */ var Result = false;
// Promise
var isFulfil = new Promise(
function (resolve, reject) {
if (fulfil) {
var value = 1; (result用value表示)
resolve(value); // 完成了
} else {
var reason = new Error('不滿足條件');(result用reason表示)
reject(reason); // reject
}
}
);
複製程式碼
-
我們用一個布林值
isfulfil
,來定義條件是否滿足。 -
我們有一個命名為
isfulfil
的Promise。這個 Promise 可以是 已完成的(resolved)(滿足條件)或者 被拒絕的(rejected) (沒有滿足條件)。 -
這裡有一個標準的語法來新建一個 Promise,參考MDN 文件,一個 promise 語法看上去像這樣。
支援的快捷鍵有:
// promise 語法看上去像這樣
new Promise(/* executor*/ function (resolve, reject) { ... } );
複製程式碼
- 當條件滿足, promise呼叫 resolve 函式和 結果變數value。如果不滿足用 reject 函式和一個理由(reason)reject(reason);
使用 Promise
現在,我們有一個 Promise。來看看怎麼使用它:
/* ES5 */
...
// 呼叫我們的 Promise
var p = function () {
isFulfil
.then(function (fulfilled) {
// 滿足條件
console.log(fulfilled);
// output: value
})
.catch(function (error) {
// 不滿足條件
console.log(error.message);
// output: 'reson'
});
};
p();
複製程式碼
- 我們有一個名為p的函式。在這個函式中,我們會使用 Promise isFulfil。
- 一旦 Promise 被解決(resolved)或者被拒(rejected),我門希望採取些措施。我們用
.then
和.catch
來實現。 - 在我們的例子中,
.then
之中有個function(fulfilled) { ... }
。fulfilled
是什麼?fulfilled
就是是你傳入 Promise 的resolve(your_success_value)
.因此,在我們例子中就是value
。 - 我們在
.catch
中有function(error){ ... }
。error 是什麼?正如你猜測的,error
正是你傳入 Promise 中的reject(your_fail_value)
。因此,在我們的例子中就是reason
。
讓我們看看例子執行之後的結果吧!
串聯 Promise
Promiss 是可串聯的。
也就是說,一個條件滿足了可以判斷下一個條件是否滿足
這就是另一個 Promise 啦。我們來寫一個!
說明:
-
在這個例子中,你可能意識到我們沒有呼叫 reject。因為這個是可選的引數。
-
我們可以簡化這個樣例就像用 Promise.resolve 代替。
// 簡略
...
// 第二個 promise
var second = function (value) {
var message = 'second new value';
return Promise.resolve(message);
};
複製程式碼
讓我們串聯 Promise。你,寶寶只能在isFulfil Promise 實現之後,才能開始 second Promise。
...
// 呼叫 Promise
var p = function () {
isFulfil
.then(second) // 在這裡串聯
.then(function (fulfilled) {
console.log(fulfilled);
// output: 'second new value'
})
.catch(function (error) {
// 不滿足條件
console.log(error.message);
// output: '不滿足條件'
});
};
複製程式碼
Promises 是非同步的
Promise 是非同步的。讓我們在呼叫 Promise 之前和之後各列印一個資訊。
// 呼叫我們的Ppromise
var p = function () {
console.log('判斷條件之前'); // 執行之前列印
isFulfil
.then(second)
.then(function (fulfilled) {
console.log(fulfilled);
})
.catch(function (error) {
console.log(error.message);
});
console.log('判斷條件之後'); // 執行之後列印
}
複製程式碼
輸出順序是這樣的:
1. 判斷條件之前
2. 判斷條件之後
3. second new value
複製程式碼
因為JavaScript不等判斷條件。
第一次條件判斷的時候等待著p的承諾(promise 這個我們稱之為 非同步(asynchronous), 程式碼不會因為阻塞或等待結果而不執行. 任何想等待 Promise 之後再執行的, 你需要把他們放入 .then