iOS 之 Promise簡易實現(xiàn)
Promises/A的API規(guī)范
1. 有限狀態(tài)機
Promise 有一個有限狀態(tài)機,共有三種狀態(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)換關系為:pending->fulfilled,pending->rejected。

2.實例方法
Promise then([{Function} onFulfilled[, {Function} onRejected]]) , 用于訂閱Promise對象狀態(tài)轉(zhuǎn)換事件,入?yún)nFulfilled為執(zhí)行成功的事件處理函數(shù),入?yún)nRejected為執(zhí)行失敗的事件處理函數(shù)。兩 者的返回值均作為Promise對象單向鏈表中下一個Promise對象的狀態(tài)轉(zhuǎn)換事件處理函數(shù)的入?yún)?。而then方法的返回值是一個新的Promise 對象并且已添加到Promise對象單向鏈表的末尾。
Promise catch({Function} onRejected) ,相當于 then(null, onRejected) 。

3.狀態(tài)函數(shù)
Promise({Function} factory/({Function} resolve, {Function} reject)/) ,構(gòu)造函數(shù)存在一個Function類型的入?yún)actory,作為唯一一個修改promise對象狀態(tài)的地方,其中factory函數(shù)的入?yún)esolve的作用是將promise對象的狀態(tài)從pending轉(zhuǎn)換為fulfilled,而reject的作用是將promise對象的狀態(tài)從pending轉(zhuǎn)換為rejected。
入?yún)?void resolve({Any} val) , 當val為非thenable對象和promise對象時則會將val作為執(zhí)行成功事件處理函數(shù)的入?yún)ⅲ魐al為thenable對象時則會執(zhí)行 thenable.then方法,若val為Promise對象時則會將該Promise對象添加到Promise對象單向鏈表中。
入?yún)?void reject({Any} reason) ,reason不管是哪種內(nèi)容均直接作為執(zhí)行失敗事件處理函數(shù)的入?yún)ⅰ?br>
Note:關于拋異常的做法,同步模式為 throw new Error("I'm synchronous way!") ,而Promise規(guī)范的做法是 reject(new Error("I'm asynchronous way!"));

4.0 Demo地址
簡單的應用

https://github.com/softwarefaith/JAPP-Promise-ObjC
不夠完善,比較簡陋
參考文章
1.阿里https://yq.aliyun.com/articles/31914
2.美團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