Nodejs - 如何做,一个简易的异步流程控制
Nodejs - 如何做,一个简易的异步流程控制
howdo
如何做,一个简易的异步流程控制
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
- 初始版本
Nodejs - 如何做,一个简易的异步流程控制
标题:
Nodejs - 如何做,一个简易的异步流程控制
特性
- 跨平台:适用于 Node.js(所有版本) 和 浏览器(包括 IE6/7/8/9/10/11、Chrome、Firefox)
- 注重约定:使用约定而非配置
- 支持同步和异步任务
- 顺序串行任务:按顺序依次执行任务
- 顺序并行任务:同时执行多个任务
- 自动实例化:自动实例化对象
- 链式操作:支持链式调用
安装
Node.js
npm i howdo -S
var howdo = require('howdo');
浏览器
直接引入脚本
<script src="/path/to/howdo.js"></script>
<script>
// howdo 挂载在 window 对象上
// do sth...
</script>
AMD 模块
define(['howdo'], function(howdo) {
// do sth...
});
CommonJS 模块
var howdo = require('howdo');
// do sth...
API
#task
分配单个任务,链式
// 分配顺序串行任务
howdo
.task(function(next) {
next(null, 1, 2, 3);
})
.task(function(next, data1, data2, data3) {
next(null, data1 + data2 + data3);
})
.follow(function(err, data) {
console.log(err); // null
console.log(data); // 6
});
// 分配顺序并行任务
howdo
.task(function(done) {
done(null, 1, 2, 3);
})
.task(function(done) {
done(null, 4);
})
.follow(function(err, data1, data2, data3, data4) {
console.log(err); // null
console.log(data1); // 1
console.log(data2); // 2
console.log(data3); // 3
console.log(data4); // 4
});
#each
循环分配任务,链式
var list = [1, 2, 3, 4];
// 批量分配顺序串行任务
howdo
.each(list, function(key, val, next, data) {
next(null, val);
})
.follow(function(err, data) {
console.log(err); // null
console.log(data); // 4
});
// 批量分配顺序并行任务
howdo
.each(list, function(key, val, done) {
done(null, val);
})
.together(function(err, data1, data2, data3, data4) {
console.log(err); // null
console.log(data1); // 1
console.log(data2); // 2
console.log(data3); // 3
console.log(data4); // 4
});
#follow
顺序串行任务,链式结束
howdo
.task(function(next) {
next(null, 1);
})
.task(function(next, data1) {
next(null, data1 * 2);
})
.follow(function(err, data) {
console.log(err); // null
console.log(data); // 2
});
#together
顺序并行任务,链式结束
howdo
.task(function(done) {
done(null, 1);
})
.task(function(done) {
done(null, 2);
})
.together(function(err, data1, data2) {
console.log(err); // null
console.log(data1); // 1
console.log(data2); // 2
});
示例:与 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, data1) {
request({url: '2'}, next);
})
.follow(function(err, data1, data2) {
console.log(err); // null
console.log(data1); // data from url 1
console.log(data2); // data from url 2
});
通过这些示例,您可以轻松地管理和控制复杂的异步流程。
不明觉厉
在客户端发N个请求就是逗比的设计……
赞一个
为了实现一个简易的异步流程控制,我们可以使用 howdo
库。howdo
是一个轻量级的库,可以在 Node.js 和浏览器中使用,它提供了简单易用的 API 来处理异步任务。
首先,我们需要安装 howdo
:
npm install howdo
接下来,我们可以通过以下方式来实现异步任务的顺序串行和顺序并行处理。
顺序串行任务
顺序串行任务意味着每个任务需要等待前一个任务完成后才能开始执行。
const howdo = require('howdo');
howdo
.task(function (next) {
setTimeout(() => {
console.log('Task 1');
next(null, 1);
}, 1000);
})
.task(function (next, result) {
setTimeout(() => {
console.log('Task 2', result);
next(null, result + 1);
}, 500);
})
.follow(function (err, result) {
console.log('Final Result:', result); // 输出 Final Result: 2
});
顺序并行任务
顺序并行任务允许同时执行多个任务,并且所有任务完成后才会进入下一个阶段。
const howdo = require('howdo');
howdo
.task(function (done) {
setTimeout(() => {
console.log('Task A');
done(null, 'A');
}, 1000);
})
.task(function (done) {
setTimeout(() => {
console.log('Task B');
done(null, 'B');
}, 500);
})
.together(function (err, result1, result2) {
console.log('Final Results:', result1, result2); // 输出 Final Results: A B
});
通过这种方式,你可以轻松地管理复杂的异步流程,无论是顺序串行还是顺序并行任务。