编辑: 笨蛋爱傻瓜悦 | 2019-07-09 |
3 ) { console.dir(info);
} 利用 generator 并行处理任务 除了重复,上述判断逻辑无疑也是强侵入性的,而如果使用 generator,我们希望 最终能通过一个数组就组织并行任务: function *main(){ let sizeInfo = {};
let sizes = yield [ size('
file1.md'
), size('
file2.md'
), size('
file3.md'
) ];
sizeInfo['
file1'
] = sizes[0];
sizeInfo['
file2'
] = sizes[1];
sizeInfo['
file3'
] = sizes[2];
} 实现这个目标之前,需要考虑如下几点: 异步任务结果的组织顺序能与声明顺序保持一致,而不是与完成顺序一致,因 为任务的完成顺序是不定的 并行任务中的任意一个失败,不再继续后续任务,而是抛出错误,交给开发者 俘获处理 为此,我们需要考虑修改运行器,当 generator 遇到数组进入暂态时,额外进行处 理: function runGenerator(gen) { 并行处理
16 // 先获得迭代器 const it = gen();
// 驱动generator运行 next();
function next(err, res) { if(err) { return it.throw(err);
const { value, done } = it.next(res);
if(done) { return;
if (Array.isArray(value)) { 存放异步任务结果 const results = [];
等待完成的任务数 let pending = value.length;
当任务队列里任意一个任务发生错误时,终止所有任务的继续 let finished = false;
value.forEach(function(func, index) { func.call(this, function(err, res) { if(err) { finished = true;
next(err);
else { 保证结果的存放顺序 results[index] = res;
直到所有任务执行完毕 if(--pending === 0) { next(null, results);
if(typeof value === '
function'
) { value.call(this, function(err, res) { 并行处理
17 if(err) { next(err, null);
else { next(null, res);
} } 并行处理
18 支持Promise Promise 是解决传统回调陷阱(callback hell)的一个策略.如果还不了解的 Promise 的,这篇 Javascript-Promise 迷你书会是最好选择,详细介绍了前世今 生、设计哲学和使用方法. 如果使用promise,我们解决
第一节中的问题就会是如下代码: 支持 promise
19 function size(f........