簡單易擴展的Node.js流程控制引擎:stepify

jopen 10年前發布 | 23K 次閱讀 stepify Node.js 開發

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定制,每一步都是那么清晰可讀!

項目主頁:http://www.baiduhome.net/lib/view/home/1407911229926

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