本來想直接寫ES7的async-await的杂靶,后來一想這不就是Promise的語法糖嗎,算了酱鸭,還是寫Promise吧吗垮。
首先我們先明確一下Promise的定義:
Promise對象用于異步操作,它表示一個尚未完成且預計在未來完成的異步操作凹髓。
我們都知道js是單線程的烁登,一次只能執(zhí)行一個任務。這就是同步模式蔚舀。
而異步模式可以一起執(zhí)行多個任務饵沧,異步任務會在當前腳本的所有同步任務結(jié)束后才會執(zhí)行。
常見的異步任務有setTimeOut赌躺,ajax狼牺。
既然有了異步任務,那我們?yōu)槭裁催€要用Promise礼患?這就涉及到異步任務的執(zhí)行順序是钥,如果執(zhí)行多個有前后順序的異步任務,代碼就會非常難調(diào)試缅叠。而且悄泥,當我們在回調(diào)中需要使用結(jié)果再次進行回調(diào),這就很難受了肤粱,這就是ES5的回調(diào)地獄弹囚。但還好,Promise使我們看到了希望领曼。
Promise的真正強大之處在于它的多重鏈式調(diào)用鸥鹉,可以避免層層嵌套回調(diào)。
Promise基本用法
Promise對象代表一個未完成悯森、但預計將來會完成的操作宋舷。
它有三種狀態(tài):
pending:初始值
fulfilled:代表操作成功
rejected:代表操作失敗
Promise實例生成以后,可以用then方法指定resolved狀態(tài)和reject狀態(tài)的回調(diào)函數(shù)瓢姻。
Promise新建后就會立即執(zhí)行祝蝠。而then方法中指定的回調(diào)函數(shù),將在當前腳本所有同步任務執(zhí)行完才會執(zhí)行。
上面的輸出就是before-resolved? ? after-resolved? ? outer? ? ?resolved
promise對象的錯誤绎狭,會一直向后傳遞细溅,直到被捕獲。即錯誤總會被下一個catch所捕獲儡嘶。
.then()
Promise.prototype.then(onFulfilled,onRejected)
.catch()
語法:Promise.prototype.catch(onRejected)
promise.then(onFulfilled).catch(onRejected)
.then中產(chǎn)生的異常能在.catch中捕獲
根據(jù)流程圖喇聊,可以看出,A拋錯時蹦狂,會按照 taskA → onRejected → finalTask這個流程來處理誓篱。A拋錯后,若沒有對它進行處理凯楔,狀態(tài)就會維持rejected窜骄,taskB不會執(zhí)行,直到catch了錯誤摆屯。