JSDeferred 原始碼分析

2022-02-22 02:23:16 字數 2883 閱讀 4904

不經意看到了乙個構思非常驚人的非同步流程控制庫,發出來分享下

關於commonjs promises請看另乙個非同步庫

整個**非常簡潔,易用,不過呢是小日本寫的東西…

api手冊:

載入jsdeferred定義延遲物件。為方便起見,我們用deferred.define()方法把介面匯出到全域性作用於中

deferred.define();
通過這樣做,你就能使用如 next(), loop(), call(), parallel() and wait() 這樣的全域性函式方法,讓我們抒寫一些非同步的流程

next(function

() ).

next(

function

() );

這個流程中,開始會彈出 「hello」,然後過5秒接著會彈出 「world」

deferred.next(function

() ).

next(

function

() );

上面是抒寫同上

個人分析:

用deferred.define()方法,無疑汙染了全域性作用域,入侵性太強了,跟mootools,prototype一樣, 不過好處嘛,很明顯,簡單易用了

還好jsdeferred也提供了無侵入的寫法

亮原始碼:

deferred.define = function

(obj, list) )();

for (var i = 0; i < list.length; i++)

return

deferred;

};

可以傳入乙個物件,用作上下文

var o = {}; //

定義乙個物件

deferred.define(o);//

把deferred的方法加持到它上面,讓o成為乙個deferred子類。

o.next(function

())

deferred.methods = ["parallel", "wait", "next", "call", "loop", "repeat", "chain"];

next方法

根據原始碼看來deferred.next其實就是乙個靜態方法

deferred.next =deferred.next_faster_way_readystatechange 

||deferred.next_faster_way_image

||deferred.next_tick

|| deferred.next_default;

顯而易見,next方法是有四種選擇優先順序,為什麼要這樣呢?

我是基於webkit的遊覽器,所以我們就直接看deferred.next_faster_way_image

//

modern browsers

var d = new

deferred();

var img = new

image();

var handler = function

() ;

img.addeventlistener("load", handler, false

); img.addeventlistener("error", handler, false

); d.canceller = function

() ;

img.src = "data:image/png," +math.random();

if (fun) d.callback.ok =fun;

return d;

流程:由此可見

next(fn).next(fn).next(fn)
其實就是

第乙個 next()    deferred.next_faster_way_image () 返回 d

第二個 next() d.next()

第二個next(),其實就是例項deferred類的原型方法了

具體我們看

next: function

(fun) ,

_post: function

(okng, fun) ,

看到_post方法,就有撥開雲霧見月明的感覺了

其實內部會有重新生成乙個 deferred物件掛到父例項的 next上,在繫結**..

如此依次迴圈處理

所以初始化的時候其實內部就生成了這麼乙個佇列

_next 上都掛著下乙個佇列處理

此時都是在初始化準備好的了,在執行的時候 image 在成功**中,我們呼叫了 d.call();

執行例項的call方法

call: function

(val) ,

_fire: function

(okng, value)

catch

(e)

if(deferred.isdeferred(value))

else

return

this

; }

總結:構思很特別,把每次鏈式的**掛到內部的next子屬性中,在處理上也保持了一條線的引用關係,而不是常規的用陣列的方式存起來

當然上面僅僅只是同步方法的處理分析,也不是標準的遵循commonjs promises規範去抒寫的

spring原始碼分析 spring原始碼分析

1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...

思科VPP原始碼分析(dpo機制原始碼分析)

vpp的dpo機制跟路由緊密結合在一起。路由表查詢 ip4 lookup 的最後結果是乙個load balance t結構。該結構可以看做是乙個hash表,裡面包含了很多dpo,指向為下一步處理動作。每個dpo都是新增路由時的乙個path的結果。dpo標準型別有 dpo drop,dpo ip nu...

redux原始碼分析(三) 原始碼部分

下面是每個部分的一些解讀 createstore apicreatestore reducer,initialstate enhancer 曾經非常好奇這個函式的第二個引數到底是initialstate還是enhancer,因為見過兩種寫法都有的,以為是版本問題。看了原始碼才發現,都可以的。如果你不...