howdo——如何做,一个简易的异步流程控制
发布于 10 年前 作者 cloudcome 4900 次浏览 最后一次编辑是 8 年前 来自 分享

howdoNPM version

如何做,一个简易的异步流程控制

FEATURES

  • nodejs(all)、browser(IE6/7/8/9/10/11、chrome、firefox)通用
  • 注重约定
  • 同步、异步任务都支持
  • 支持顺序串行任务
  • 支持顺序并行任务
  • 自动实例化
  • 链式操作

INSTALL

nodejs

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

browser

Dir

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

AMD

defined(['howdo'], function(howdo){
    // do sth...
});

CJS

var howdo = require('howdo');
// do sth...

API

#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(function (err, data) {
        // err = null
        // data = 6
    });


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

#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(function (err, data) {
        // err = null
        // data = 4
    });


// 批量分配顺序并行任务
howdo
    .each(list, function (key, val, done) {
        done(null, val);
    })
    .together(function (err, data1, data2, data3, data4) {
        // err = null
        // data1 = 1
        // data2 = 2
        // data3 = 3
        // data4 = 4
    });

#follow 顺序串行任务,链式结束

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

#together 顺序并行任务,链式结束

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

Howdo VS AJAX

// 此处以jquery为例
// 首先来改装下 $.ajax
function request(options, callback) {
    $.ajax(options).done(function (json) {
        if (json.error) {
            return callback(new Error(json.error));
        }

        callback(null, json.data);
    }).fail(function (jqXHR) {
        callback(new Error(jqXHR.responseText));
    });
}


howdo.task(function (next) {
    request({
        url: '1'
    }, next);
}).task(function (next) {
    request({
        url: '2'
    }, next);
}).follow(function (err, data) {
    // do sth...
});


howdo.task(function (done) {
    request({
        url: '1'
    }, done);
}).task(function (done) {
    request({
        url: '2'
    }, done);
}).follow(function (err, data1, data2) {
    // do sth...
});

MORE

VERSION

v 1.1.1

  • 修复空列表的each问题

v 1.1.0

  • 兼容到IE6、chrome、firefox
  • 兼容到nodejs

v 0.0.1

  • 初始版本
5 回复

在客户端发N个请求就是逗比的设计……

@hainee 不仅仅是异步请求,同异步操作都可行。以上只是举例

回到顶部