node package manager

howdo

任务流程控制

howdo

Build Status howdo

任务流程控制。

入门指引:http://FrontEndDev.org/column/howdo-introduction/

FEATURES

  • node、浏览器通用
  • 任务流程控制,支持同步、异步任务
  • 支持串行、并行任务
  • 支持捕获任务的错误
  • 支持中止任务
  • 支持回退任务
  • 支持无限任务

INSTALL

nodejs

npm install -S howdo
var howdow = require('howdo');

browser

CMD

defined(function(require, exports, module){
    var howdo = require('./path/to/howdo.js');
});

全局

<script src="/path/to/howdo.js"></script>
<script>
// howdo挂载在window对象上
// do sth...
</script> 

API

遵守这个约定,回调的第一个参数为错误对象。

// err 为 null 或 undefined 时表示回调成功
// 否则为回调失败
callback(err, ...);

#task 分配单个任务,链式

// 分配顺序串行任务 
howdo
    // 分配单次任务 1 
    .task(function (next) {
        // 第一个参数必须是Error对象的实例,如果没有错误,传null 
        // 可以传多个结果给下一个任务接收 
        next(null, 1, 2, 3);
    })
    // 分配单次任务 2 
    .task(function (next, data1, data2, data3) {
        // data1 = 1 
        // data2 = 2 
        // data3 = 3 
        next(null, data1 + data2 + data3);
    })
    .follow()
    .try(function(data){
        // data = 6 
    })
    .catch(function (err) {
        // err = null 
    });
 
 
// 分配顺序并行任务 
howdo
    // 分配单次任务 1 
    .task(function (done) {
        // 第一个参数必须是Error对象的实例,如果没有错误,传null 
        // 可以传多个结果给结果接收 
        done(null, 1, 2, 3);
    })
    // 分配单次任务 2 
    .task(function (done) {
        done(null, 4);
    })
    .follow()
    .try(function(data1, data2, data3, data4){
        // data1 = 1 
        // data2 = 2 
        // data3 = 3 
        // data4 = 4 
    })
    .catch(function(err){
        // err = null 
    });

#each 循环分配任务,链式

// task是用来分配单个次序任务,而如果是批量次序任务的话,就需要用each来操作了 
 
var list = [1, 2, 3, 4];
 
// 批量分配顺序串行任务 
howdo
    .each(list, function (key, val, next, data) {
        // 第1次: data = undefined 
        // 第2次: data = 1 
        // 第3次: data = 2 
        // 第4次: data = 3 
        next(null, val);
    })
    .follow()
    .try(function(data){
        // data = 4 
    })
    .catch(function(err){
        // err = null 
    });
 
 
// 批量分配顺序并行任务 
howdo
    .each(list, function (key, val, done) {
        done(null, val);
    })
    .together()
    .try(function(data1, data2, data3, data4){
        // data1 = 1 
        // data2 = 2 
        // data3 = 3 
        // data4 = 4 
    })
    .catch(function(err){
        // err = null 
    });

#follow 顺序串行任务,链式

follow用来收集任务结果,如其字面意思,表示多个任务是顺序串行执行的。

#together 顺序并行任务,链式

together也是用来收集任务结果,如其字面意思,表示多个任务是顺序并行执行的。

try 任务成功回调,链式

.try(function(arg0, arg1, ...){
    // ...
})

catch 任务失败回调,链式

.try(function(err){
    // 任务失败的回调
})

until直到条件达成,否则一直继续

howdo
    .task(function(next){
        setTimeout(function(){
            next(null, Math.random());
        }, 500);
    })
    .until(function(value){
        return value > 0.8;
    })
    .follow()
    .try(function(value){
        value > 0.8 === true;
    });

rollback回滚任务

var a = 1;
 
howdo
    .task(function(next){
        a++;
        setTimeout(function(){
            next(new Error('任务出错'));
        });
    })
    .rollback(function(){
        a--;
    })
    .follow(function(){
        a === 1;
    });

abort中止任务

var a = 1;
 
howdo
    .task(function(next){
        this.timeid = setTimeout(function(){
            a++;
            next(new Error('任务1出错'));
        }, 100);
    })
    .rollback(function(){
        a--;
    })
    .task(function(next){
        this.timeid = setTimeout(function(){
            a++;
            next(new Error('任务2出错'));
        }, 200);
    })
    .abort(function(){
        clearTimeout(this.timeid);
    })
    .together(function(){
        a === 1;
    });

VERSION

3.3.x

  • 增加了until接口,支持多任务串行和并行
  • 增加了rollback接口,回滚任务
  • 增加了abort接口,中止任务

2.x

  • 增加了trycatch两个接口

v1.x

  • 增加了.task任务接口
  • 增加了.each循环接口
  • 增加了.follow串行接口
  • 增加了.together并行接口