/data-flow

data-flow, help tp adjust data step by step

Primary LanguageJavaScript

data-flow

Build Status

代码里总有一些 step 是要逐个执行,每一个 stepN 依赖上一个 stepN-1 的结果

function step1(){ /* ... */ };
function step2(){ /* ... */ };
function step3(){ /* ... */ };
function step4(){ /* ... */ };
// step1 --> 4
step4( step3( step2( step1() ) ) );

所以在 underscore 里面我们看到这个方法 _.compose

_.compose( step4, step3, step2, step1 );

但是 stepN 不一定总是成功完成,而且 stepN 有可能是一个异步(async)的过程

所以这里提供一个 DataFlow 的模式来处理上面的情况

DataFlow.set( '<name>', { /* init config */ }, [ step1, step2, step3, step4, ... ] );
DataFlow.start( '<name>' /*, <init-data> */ );

Base

  • 依赖 promise

Install

npm install data-flow

Usage

import DataFlow from "data-flow"; // ES6
// or
var DataFlow = require( 'data-flow' ); // ES5

// Let's go
DataFlow.set( '<name>', '<config>', [ /* steps */ ] );

DataFlow.start( '<name>', <init-data> );

Options

TODO

Case

  • API 设置

有一个接口 api/get-list,可以使用 DataFlow 封装一下ES5

// 设置接口
function buildAjaxStep( { url, method = 'get' } ){
    return ( data ) => {
        // @return {Promise}
        return ajax[ method ]( url, data )
    }
}
// 匿名使用
    DataFlow.start( [ buildAjaxStep({ url : 'api/get-list' }) ], /* data */ );

// 封装调用

    // 封装
    DataFlow.set( 'get-list', {}, [ buildAjaxStep({ url : 'api/get-list' }) ] );

    // 调用
    DataFlow.start( 'get-list', { /* data */ } );
    // or
    DataFlow( 'get-list' )( /* data */ );

```api/get-list

现在希望每次调用 api/get-list 的时候打个 log [ES5](http://babeljs.io/repl/#?evaluate=true&presets=es2015%2Cstage-0&experimental=false&loose=false&spec=false&code=function%20logAjax(%20data%2C%20%7B%20config%20%7D%20)%7B%0D%0A%20%20%20%20console.log(%20config%20)%3B%0D%0A%20%20%20%20return%20data%3B%0D%0A%7D%0D%0ADataFlow.set(%20'api%2Fget-list'%2C%20%7B%20url%20%3A%20'url%2Fto%2Fapi'%20%7D%2C%20%5B%20logAjax%2C%20stepAjax%20%5D%20)%3B)
```javascript
function logAjax( data, { config } ){
    console.log( config );
    return data;
}
DataFlow.set( 'api/get-list', { url : 'url/to/api' }, [ logAjax, stepAjax ] );