周六不想呆家里就跑到公司寫代碼來了喊儡。這周公司碰到一個問題拨与, 在ios低版本(7.1.1)下、我們開發(fā)的產(chǎn)品調(diào)用數(shù)據(jù)出現(xiàn)問題艾猜,結(jié)果拿真機(jī)一次买喧,竟然是低版本瀏覽器內(nèi)核不支持promise。只要找到問題就能解決匆赃。
好了淤毛,還是講講什么是promise對象吧。
想象這么一個場景算柳,用戶進(jìn)入首頁需要先調(diào)一個接口低淡,首先要確認(rèn)他是哪所學(xué)校,然后才能確認(rèn)他是學(xué)校的什么崗位(校長瞬项、老師蔗蹋、班主任等),最后才能從后臺返回供他使用的數(shù)據(jù)等囱淋≈砗迹可能你會這么寫:
ajax({
url: url1,
success: function(data) {
ajax({
url: url2,
data: data,
success: function() {
}
});
}
});
如果繼續(xù)下去在回調(diào)函數(shù)中進(jìn)行下一步操作,嵌套的層數(shù)會越來越多妥衣。我們可以進(jìn)行適當(dāng)?shù)母倪M(jìn)皂吮,把回調(diào)函數(shù)寫到外面
function A() {
ajax({
url: url1,
success: function(data) {
B(data);
}
});
}
function B(data) {
ajax({
url: url2,
success: function(data) {
......
}
});
}
即使是改寫成這樣,代碼還是不夠直觀称鳞,但是如果有了Promise對象涮较,代碼就可以寫得非常清晰,一目了然:
new Promise(A).done(B);
這樣函數(shù)B就不用寫在A的回調(diào)中了冈止,是不是很直觀~狂票!
從上面需求知道接口是一步完了才能進(jìn)行下一步(異步操作)。
Promise 是 Common.js
的規(guī)范之一熙暴,擁有resolve
闺属、reject
、fail
周霉、then
等方法掂器。能夠幫助我們控制代碼的流程,避免函數(shù)的多層嵌套俱箱。
(1)對象的狀態(tài)不受外界影響国瓮。Promise 對象代表一個異步操作,有三種狀態(tài):Pending
(進(jìn)行中)、Resolved
(已完成乃摹,又稱 Fulfilled
)和 Rejected
(已失斀臁)。只有異步操作的結(jié)果孵睬,可以決定當(dāng)前是哪一種狀態(tài)播歼,任何其他操作都無法改變這個狀態(tài)。
(2)一旦狀態(tài)改變掰读,就不會再變秘狞,任何時候都可以得到這個結(jié)果。Promise 對象的狀態(tài)改變蹈集,只有兩種可能:從 Pending 變?yōu)?Resolved 和從 Pending 變?yōu)?Rejected烁试。只要這兩種情況發(fā)生,狀態(tài)就凝固了雾狈,不會再變了廓潜,會一直保持這個結(jié)果。
promise.all 怎么用
Promise.all 是在所有的Promise對象都執(zhí)行完成之后resolve善榛。參數(shù)是一個數(shù)組辩蛋,數(shù)組的每一項(xiàng)都是一個Promise對象就可以。
Promise.all( [
promise1,
promise2
] ).then( function() {
// do something
} );
Proimse.all( [ Promise.resolve(), Promise.resolve() ] ).then( function() {
// do something
} );
比如有兩個異步的執(zhí)行:
Promise.all( [
new Promise( function( resolve ) {
setTimeout( function() {
resolve();
}, 2000 );
} ),
new Promise( function( resolve ) {
setTimeout( function() {
resolve();
}, 2000 );
} )
] );
其它方法不講了移盆,隨用隨查吧悼院。