编辑: 笨蛋爱傻瓜悦 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........

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题