有了promise對(duì)象就可以將異步操作以同步操作的流程表達(dá)出來(lái),避免了嵌套的回調(diào)函數(shù)。
varp1=newPromise(function(resolve,reject){setTimeout(()=>reject(newError('fail')),3000)})varp2=newPromise(function(resolve,reject){setTimeout(()=>resolve(p1),1000)})p2.then(result=>console.log(result)).catch(error=>console.log(error))// Error: fail
上面代碼中,p1是一個(gè)Promise,3秒之后變?yōu)閞ejected。p2的狀態(tài)在1秒之后改變,resolve方法返回的是p1。由于p2返回的是另一個(gè) Promise,導(dǎo)致p2自己的狀態(tài)無(wú)效了,由p1的狀態(tài)決定p2的狀態(tài)。所以,后面的then語(yǔ)句都變成針對(duì)后者(p1)。又過(guò)了2秒,p1變?yōu)閞ejected,導(dǎo)致觸發(fā)catch方法指定的回調(diào)函數(shù)。
注意,調(diào)用resolve或reject并不會(huì)終結(jié) Promise 的參數(shù)函數(shù)的執(zhí)行。
newPromise((resolve,reject)=>{resolve(1);console.log(2);}).then(r=>{console.log(r);});// 2// 1
一般來(lái)說(shuō),調(diào)用resolve或reject以后,Promise 的使命就完成了,后繼操作應(yīng)該放到then方法里面,而不應(yīng)該直接寫(xiě)在resolve或reject的后面。所以,最好在它們前面加上return語(yǔ)句,這樣就不會(huì)有意外。