簡單易擴展的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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!