Nodejs Q promise設計思路

2022-09-04 07:48:10 字數 2019 閱讀 8473

q庫為nodejs提供了乙個基於promise的程式設計方式,從此避免了一層又一層的callback呼叫。不過q的靈活性也給我造成了很大困擾,我可以用promise去resolve promise麼,我在then裡return promise可以麼?因此我研究了下q庫的源**,幸運的是,q庫提供了乙份詳細的設計文件,極大的方便了我們對其設計思路的理解。

跳過一些最原始的版本,我們先看看根據promise的最基本工作方式,能想到的最簡單的promise實現。

var defer = function () 

pending = undefined;

},then: function (callback) else }}

};

在defer裡儲存函式,傳遞到then裡的callback會在原defer被resolve時觸發,這是最直觀的promise實現方式。

這種實現方式無法實現鏈結,defer.promise.then.then.then是不能實現的,另外defer.resolve只能用實值而不能用promise。

為了能夠將promise鏈結起來,then函式必須也return乙個promise,為了能夠用promise去resolve defer。q提供了乙個對實值的封裝。

var ref = function (value) };

};

如果value本身為promise,就返回該promise,如果該value為實值,就返回乙個已經被resolve了的promise,resolve value就是這個實值。

var ref = function (value) };

};

這個版本將callback的返回值也封裝成promise,因此then函式的返回值可以繼續用then繼續鏈結下去。不過我們還沒法用promise去resolve defer,因此引出了下面這個版本。

var defer = function () 

pending = undefined;}},

promise: ;

if (pending) else

return result.promise;}}

};};

在resolve乙個defer時,defer會將該value封裝成乙個promise。然後會將目前儲存的callbacks傳遞到該promise的then函式中,callback函式的呼叫時機取決於該promise的resolve時刻了。

注意,這裡儲存的callback也不是通過then函式傳遞進來的callback了,為了實現then的鏈結,儲存的callback做的實際事情是呼叫傳遞進來的callback,並且用結果去resolve內部新建的乙個defer,並且then函式返回該新建defer的promise。

簡而言之,then裡面傳遞的callback函式也可以返回乙個promise,之後的then鏈裡只有在該promise被resolve時才會被呼叫。

因此現在我們的q庫可以寫出如下的呼叫方式:

var defera = q.defer();

defera.promise //promisea

.then(function(value))

.then(function(value));

defer.resolve(promise1);

這套函式會構造出乙個鏈條:

defera ->promisea -> hidden_defera -> call func1 -> promise2 -> hidden_defer2 -> call func2 -> promise3
也就是說,每次對乙個promise呼叫then時,它就會建立乙個隱藏的defer,返回這個defer的promise,當原promise被resolve時,該defer也會被傳遞進去的函式生成的結果resolve。

到這一步為止,就是q的promise的大概實現原理了。然而q為了進一步抽象和提高,做出了乙個message機制,以後的文章再仔細研究。

android layout weight設定解讀

參考文章 android layout weight的真實含義是 一旦view設定了該屬性 假設有效的情況下 那麼該 view的寬度等於原有寬度 android layout width 加上其在剩餘空間中的佔比!設螢幕寬度為l,在兩個view的寬度都為match parent的情況下,原有寬度為l...

Android RecyclerView設定空布局

1 自定義乙個emptyrecyclerview繼承recyclerview 2 採用adapterdataobserver觀察者模式來監聽資料的變化,如果有資料就隱藏空布局,反之,則顯示。view memptyview private adapterdataobserver emptyobserv...

Capacity Scheduler 佇列設定

先附乙個官網位址 capacity scheduler是yarn中預設的資源排程器。資源分配相關引數 1 capacity 佇列的資源容量 百分比 當系統非常繁忙時,應保證每個佇列的容量得到滿足,而如果每個佇列應用程式較少,可將剩餘資源共享給其他佇列。注意,所有佇列的容量之和應小於100。2 max...