iOS 之 Promise簡(jiǎn)易實(shí)現(xiàn)
Promises/A的API規(guī)范
1. 有限狀態(tài)機(jī)
Promise 有一個(gè)有限狀態(tài)機(jī)揖铜,共有三種狀態(tài):pending(執(zhí)行中)涩维、fulfilled(執(zhí)行成功)和rejected(執(zhí)行失敗)墙歪。
其中pending為初始狀態(tài)乌企,fulfilled和rejected為結(jié)束狀態(tài)(結(jié)束狀態(tài)表示promise的生命周期已結(jié)束)晌该。
狀態(tài)轉(zhuǎn)換關(guān)系為:pending->fulfilled拱层,pending->rejected弥臼。
2.實(shí)例方法
Promise then([{Function} onFulfilled[, {Function} onRejected]]) , 用于訂閱Promise對(duì)象狀態(tài)轉(zhuǎn)換事件舱呻,入?yún)nFulfilled為執(zhí)行成功的事件處理函數(shù),入?yún)nRejected為執(zhí)行失敗的事件處理函數(shù)悠汽。兩 者的返回值均作為Promise對(duì)象單向鏈表中下一個(gè)Promise對(duì)象的狀態(tài)轉(zhuǎn)換事件處理函數(shù)的入?yún)⑾渎馈6鴗hen方法的返回值是一個(gè)新的Promise 對(duì)象并且已添加到Promise對(duì)象單向鏈表的末尾。
Promise catch({Function} onRejected) 柿冲,相當(dāng)于 then(null, onRejected) 茬高。
3.狀態(tài)函數(shù)
Promise({Function} factory/({Function} resolve, {Function} reject)/) ,構(gòu)造函數(shù)存在一個(gè)Function類(lèi)型的入?yún)actory假抄,作為唯一一個(gè)修改promise對(duì)象狀態(tài)的地方怎栽,其中factory函數(shù)的入?yún)esolve的作用是將promise對(duì)象的狀態(tài)從pending轉(zhuǎn)換為fulfilled丽猬,而reject的作用是將promise對(duì)象的狀態(tài)從pending轉(zhuǎn)換為rejected。
入?yún)?void resolve({Any} val) 熏瞄, 當(dāng)val為非thenable對(duì)象和promise對(duì)象時(shí)則會(huì)將val作為執(zhí)行成功事件處理函數(shù)的入?yún)⒔潘睿魐al為thenable對(duì)象時(shí)則會(huì)執(zhí)行 thenable.then方法,若val為Promise對(duì)象時(shí)則會(huì)將該P(yáng)romise對(duì)象添加到Promise對(duì)象單向鏈表中强饮。
入?yún)?void reject({Any} reason) 由桌,reason不管是哪種內(nèi)容均直接作為執(zhí)行失敗事件處理函數(shù)的入?yún)ⅰ?br>
Note:關(guān)于拋異常的做法,同步模式為 throw new Error("I'm synchronous way!") 邮丰,而Promise規(guī)范的做法是 reject(new Error("I'm asynchronous way!"));
4.0 Demo地址
簡(jiǎn)單的應(yīng)用
https://github.com/softwarefaith/JAPP-Promise-ObjC
不夠完善行您,比較簡(jiǎn)陋
參考文章
1.阿里https://yq.aliyun.com/articles/31914
2.美團(tuán)http://tech.meituan.com/promise-insight.html
3.阮一峰http://javascript.ruanyifeng.com/advanced/promise.html
3.deferhttp://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html