簡單易擴展的Node.js流程控制引擎:stepify
stepify是一個簡單易擴展的Node.js流程控制引擎,采用方法鏈(methods chain)的方式定制異步任務,使得Node.js工作流易于理解和維護。
目標是將復雜的任務進行拆分成多步完成,使得每一步的執行過程更加透明,化繁為簡。
stepify特點
-
最基本的API的就3個:
step(),done(),run(),簡單容易理解。 -
精細的粒度劃分(同時支持單/多任務),執行順序可定制化。
-
每一個異步操作都經過特殊的封裝,內部只需要關心這個異步的執行過程。
-
鏈式(chain)調用,代碼邏輯看起來比較清晰。
-
靈活的回調函數定制和參數傳遞。
-
統一處理單個異步操作的異常,也可根據需要單獨處理某個任務的異常。
最簡單的用法
簡單實現基于oauth2授權獲取用戶基本資料的例子:
// Authorizing based on oauth2 workflow
Stepify()
.step('getCode', function(appId, rUri) {
var root = this;
request.get('[authorize_uri]', function(err, res, body) {
root.done(err, JSON.parse(body).code);
});
}, [appId], [redirectUri])
.step('getToken', function(code) {
var root = this;
request.post('[token_uri]', function(err, res, body) {
root.done(err, JSON.parse(body).access_token);
});
})
.step('getInfo', function(token) {
request.get('[info_uri]?token=' + token, function(err, res, body) {
// got user info, pass it to client via http response
});
})
.run(); 多個step共用一個handle、靜態參數、動態參數傳遞的例子:
Stepify()
.step('read', __filename)
.step(function(buf) {
// buf is the buffer content of __filename
var root = this;
var writed = 'test.js';
// do more stuff with buf
// this demo just replace all spaces simply
buf = buf.toString().replace(/\s+/g, '');
fs.writeFile(writed, buf, function(err) {
// writed is the name of target file,
// it will be passed into next step as the first argument
root.done(err, writed);
});
})
.step('read')
// `read` here is a common handle stored in workflow
.read(function(p, encoding) {
fs.readFile(p, encoding || null, this.done.bind(this));
})
.run(); 這里多了一個read()方法,但read方法并不是stepify內置的方法。實際上,您可以任意“擴展”stepify鏈!它的奧妙在于step()方法的參數,詳細請看step調用說明。
可以看到,一個復雜的異步操作,通過stepify定制,每一步都是那么清晰可讀!
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!