Promise原始碼分析
Promise原始碼分析
程式碼如下:
/*
我們要滿足狀態只能三種狀態:PENDING,FULFILLED,REJECTED三種狀態,且狀態只能由PENDING=>FULFILLED,或者PENDING=>REJECTED
*/
var PENDING = 0;
var FULFILLED = 1;
var REJECTED = 2;
/*
value狀態為執行成功事件的入參,deferreds儲存著狀態改變之後的需要處理的函式以及promise子節點,建構函式里面應該包含這三個屬性的初始化
*/
function Promise(callback) {
this.status = PENDING;
this.value = null;
this.defferd = [];
setTimeout(callback.bind(this, this.resolve.bind(this), this.reject.bind(this)), 0);
}
Promise.prototype = {
constructor: Promise,
//觸發改變promise狀態到FULFILLED
resolve: function (result) {
this.status = FULFILLED;
this.value = result;
this.done();
},
//觸發改變promise狀態到REJECTED
reject: function (error) {
this.status = REJECTED;
this.value = error;
},
//處理defferd
handle: function (fn) {
if (!fn) {
return;
}
var value = this.value;
var t = this.status;
var p;
if (t == PENDING) {
this.defferd.push(fn);
} else {
if (t == FULFILLED && typeof fn.onfulfiled == 'function') {
p = fn.onfulfiled(value);
}
if (t == REJECTED && typeof fn.onrejected == 'function') {
p = fn.onrejected(value);
}
var promise = fn.promise;
if (promise) {
if (p && p.constructor == Promise) {
p.defferd = promise.defferd;
} else {
p = this;
p.defferd = promise.defferd;
this.done();
}
}
}
},
//觸發promise defferd裡面需要執行的函式
done: function () {
var status = this.status;
if (status == PENDING) {
return;
}
var defferd = this.defferd;
for (var i = 0; i defferd.length; i++) {
this.handle(defferd[i]);
}
},
/*儲存then函式里面的事件
返回promise物件
defferd函式當前promise物件裡面
*/
then: function (success, fail) {
var o = {
onfulfiled: success,
onrejected: fail
};
var status = this.status;
o.promise = new this.constructor(function () {
});
if (status == PENDING) {
this.defferd.push(o);
} else if (status == FULFILLED || status == REJECTED) {
this.handle(o);
}
return o.promise;
}
};
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3349/viewspace-2805392/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Promise 原始碼分析Promise原始碼
- 老生常談:Promise 用法與原始碼分析Promise原始碼
- 手寫一個Promise,附原始碼分析Promise原始碼
- Promise 原始碼解析Promise原始碼
- Promise原始碼實現Promise原始碼
- Promise 原始碼:靜態方法Promise原始碼
- koa原始碼中的promise原始碼Promise
- Promise 原始碼:then 鏈式呼叫Promise原始碼
- Promise 原始碼:實現一個簡單的 PromisePromise原始碼
- Promise-Polyfill原始碼解析(2)Promise原始碼
- Promise實現原理(附原始碼)Promise原始碼
- Promise-Polyfill原始碼解析(1)Promise原始碼
- Promise 原始碼:同步執行 resolvePromise原始碼
- Promise的原始碼實現(完美符合Promise/A+規範)Promise原始碼
- Retrofit原始碼分析三 原始碼分析原始碼
- Promise 原始碼:非同步執行 resolvePromise原始碼非同步
- 小邵教你玩轉promise原始碼Promise原始碼
- 70行實現Promise核心原始碼Promise原始碼
- 集合原始碼分析[2]-AbstractList 原始碼分析原始碼
- 集合原始碼分析[3]-ArrayList 原始碼分析原始碼
- Guava 原始碼分析之 EventBus 原始碼分析Guava原始碼
- 【JDK原始碼分析系列】ArrayBlockingQueue原始碼分析JDK原始碼BloC
- 集合原始碼分析[1]-Collection 原始碼分析原始碼
- Android 原始碼分析之 AsyncTask 原始碼分析Android原始碼
- 以太坊原始碼分析(36)ethdb原始碼分析原始碼
- 以太坊原始碼分析(38)event原始碼分析原始碼
- 以太坊原始碼分析(41)hashimoto原始碼分析原始碼
- 以太坊原始碼分析(43)node原始碼分析原始碼
- 以太坊原始碼分析(51)rpc原始碼分析原始碼RPC
- 以太坊原始碼分析(52)trie原始碼分析原始碼
- 小而美的Promise庫——promiz原始碼解析Promise原始碼
- Promise原始碼解析-步步為營皆可及Promise原始碼
- 手動實現一個promise(原始碼)Promise原始碼
- Promise原始碼漸進式解讀(三)Promise原始碼
- 深度 Mybatis 3 原始碼分析(一)SqlSessionFactoryBuilder原始碼分析MyBatis原始碼SQLSessionUI
- k8s client-go原始碼分析 informer原始碼分析(6)-Indexer原始碼分析K8SclientGo原始碼ORMIndex
- k8s client-go原始碼分析 informer原始碼分析(4)-DeltaFIFO原始碼分析K8SclientGo原始碼ORM
- 5.2 spring5原始碼--spring AOP原始碼分析三---切面原始碼分析Spring原始碼