#什么是Promise
Promise對象用于表示一個異步操作得最終狀態(tài)(完成或者失敺蚁ァ)以及其返回的值。---MDN
Promise對象中存放著未來我們要做的事情形娇,比如一個異步操作
- 如果返回的結(jié)果是成功锰霜,那么我們就做成功時候的事情
- 如果返回的結(jié)果是失敗,那么我們就做失敗時候的事情
同步和異步
- 同步任務(wù)會阻塞程序執(zhí)行(alert桐早、for癣缅、......)
- 異步任務(wù)不會阻塞程序執(zhí)行(setTimeout厨剪、fs.readFile、......)
Promise的then方法
一個 promise 必須提供一個 then 方法以訪問其當(dāng)前值友存、終值和據(jù)因祷膳。promise 的 then 方法接受兩個參數(shù):
promise.then(onFulfilled, onRejected)。
用通俗的話來說:(參考鏈接)
then方法提供一個供自定義的回調(diào)函數(shù)屡立,若傳入非函數(shù)直晨,則會忽略當(dāng)前then方法。
回調(diào)函數(shù)中會把上一個then中返回的值當(dāng)做參數(shù)值供當(dāng)前then方法調(diào)用膨俐。then方法執(zhí)行完畢后需要返回一個新的值給下一個then調(diào)用(沒有返回值默認(rèn)使用undefined)勇皇。每個then只可能使用前一個then的返回值。
解決異步上的問題
比較傳統(tǒng)的回調(diào)方式與promise
回調(diào)->金字塔型焚刺,
function f(cb) {
setTimeout(function() {
cb && cb();
}, 1000);
}
f(function() {
console.log(1);
f(function() {
console.log(2);
f(function() {
console.log(3);
f(function() {
console.log(4);
f(function() {
console.log(5);
f(function() {
console.log(6);
});
});
});
});
});
});
Promise -> 鏈?zhǔn)?:邏輯更清晰
使用promise去做一個流程的控制敛摘,肯定比回調(diào)要舒服很多,不管從維護(hù)上來講還是可讀性來講乳愉,都是Promise更優(yōu)一點
function f() {
return new Promise(resolve => {
setTimeout(function() {
resolve();
}, 1000);
})
}
f()
.then(function() {
console.log(1);
return f();
})
.then(function() {
console.log(2);
return f();
})
.then(function() {
console.log(4);
return f();
})
.then(function() {
console.log(3);
return f();
})
.then(function() {
console.log(5);
return f();
})
.then(function() {
console.log(6);
});
如下代碼兄淫,
let promise = new Promise( resolve => {
console.log('Promise');
resolve();
});
promise.then(function(){
console.log('resolved');
})
console.log('Hello!');
按照順序輸出的結(jié)果為 Promise Hello! resolved
。
Promise 新建后立即執(zhí)行蔓姚,所以首先輸出的是Promise捕虽,然后,then方法指定的回調(diào)函數(shù)赂乐,將在當(dāng)前腳本所有同步任務(wù)執(zhí)行完才會執(zhí)行薯鳍,所以resolved最后輸出