一步一步实现基于Task的Promise库(三)waitFor方法的设计
2014-07-26 11:52
211 查看
在上一篇中我们已经完成了Task.js里面的all和any方法,已经可以完美的解决大部分需求,我们再来看一个需求:
我们要先读取aa.txt的内容,然后去后台解析,同时由用户指定一个文件,也要读取解析,然后当两个文件都解析完了,我们还要合并两部分内容存到cc.txt中,最后发个通知说ok了。。
这里的用户是指真正浏览网页的用户,可能是说让用户上传一个文件去读取解析,但是aa.txt是程序定好了的,我们也不希望用户上传文件之后再去读取解析aa.txt,怎么办?如果有一个waitFor方法可以等待另一个任务的完成就好了,请看下面代码:
上面代码中的waitFor方法并不会导致taskExp_2的执行,如果用户不点击btnUpload按钮来触发taskExp_2.start(); 那么taskExp_3将一直等待taskExp_2的执行并完成,然后才能进行后面的writeFile。嗯,这样确实可以解决这个头疼的需求,下面我们来看看waitFor方法该如何设计呢?
先看看下面两句代码有什么区别?
区别在于使用all方法会导致taskExp3_1的执行,而waitFor不会,如果没有taskExp3_1.start()这句话,taskExp3_2永远也不可能执行完成,它会一直等待taskExp3_1的执行并完成,除此之外就没有区别了.那么waitFor方法的定位就是设计给那些不希望即时执行的Task的(如果你希望Task的即时执行,那么请用all)
从逻辑上来说上面的taskExp3_1是不需要接收readFile的返回参数的,那么readFile的返回参数实际上是给后面的mergeContent使用的.我们实际上是把
转换成
只不过我们不让taskExp3_1触发执行. 然后我们还希望mergeContent回调方法里面可以通过this.Param[0]和this.Param[1]分别取到readFile和taskExp3_1的输出参数.
那么waitFor方法最复杂的情况是什么呢?
只有在func1,func2,func3,task1,task2都执行完成了才会执行callback,并且task1,task2必须自己调用start()触发执行,否则taskExp3_2会一直等待.
其实我们已经发现有点不对劲了,那就是waitFor方法为什么一定要耦合func1,func2,func3的all逻辑呢?
这样做是不是更好呢? 答案是肯定的,我们应该设计all(),any(),new Task(),好处是支持了下面几种写法:
看来在实现waitFor方法之前我们要先实现all(),any(),new Task()这些不传参的方法,同时这些方法的实现要注意什么呢?
这句代码应该等效于:
同时func1,func2返回的参数不能因为all()的执行而传递不到callback1。在下一章我们来实现这些不传参的方法。
我们要先读取aa.txt的内容,然后去后台解析,同时由用户指定一个文件,也要读取解析,然后当两个文件都解析完了,我们还要合并两部分内容存到cc.txt中,最后发个通知说ok了。。
这里的用户是指真正浏览网页的用户,可能是说让用户上传一个文件去读取解析,但是aa.txt是程序定好了的,我们也不希望用户上传文件之后再去读取解析aa.txt,怎么办?如果有一个waitFor方法可以等待另一个任务的完成就好了,请看下面代码:
var taskExp_1 = new Task(readFile, "aa.txt").then(resolveFile, "/service/fileResolve.ashx?file=aa.txt"); var taskExp_2 = new Task(uploadFile, "bb.txt").then(readFile, "bb.txt").then(resolveFile, "/service/fileResolve.ashx?file=bb.txt"); var taskExp_3 = new Task(taskExp_1).waitFor(taskExp_2).then(writeFile, ["cc.txt"]).then(sendMail).start(); $("#btnUpload").click(function (){ taskExp_2.start(); });
上面代码中的waitFor方法并不会导致taskExp_2的执行,如果用户不点击btnUpload按钮来触发taskExp_2.start(); 那么taskExp_3将一直等待taskExp_2的执行并完成,然后才能进行后面的writeFile。嗯,这样确实可以解决这个头疼的需求,下面我们来看看waitFor方法该如何设计呢?
先看看下面两句代码有什么区别?
var taskExp3_2 = new Task(readFile, "bb.txt").waitFor(taskExp3_1).then(mergeContent).start(); var taskExp3_2 = new Task([readFile, "bb.txt"], taskExp3_1).all(mergeContent).start();
区别在于使用all方法会导致taskExp3_1的执行,而waitFor不会,如果没有taskExp3_1.start()这句话,taskExp3_2永远也不可能执行完成,它会一直等待taskExp3_1的执行并完成,除此之外就没有区别了.那么waitFor方法的定位就是设计给那些不希望即时执行的Task的(如果你希望Task的即时执行,那么请用all)
从逻辑上来说上面的taskExp3_1是不需要接收readFile的返回参数的,那么readFile的返回参数实际上是给后面的mergeContent使用的.我们实际上是把
new Task(readFile, "bb.txt").waitFor(taskExp3_1).then(mergeContent).start();
转换成
new Task([readFile, "bb.txt"], taskExp3_1).all(mergeContent).start();
只不过我们不让taskExp3_1触发执行. 然后我们还希望mergeContent回调方法里面可以通过this.Param[0]和this.Param[1]分别取到readFile和taskExp3_1的输出参数.
那么waitFor方法最复杂的情况是什么呢?
var taskExp3_2 = new Task([func1],[func2],[func3]).waitFor(task1, task2).then(callback).start();
只有在func1,func2,func3,task1,task2都执行完成了才会执行callback,并且task1,task2必须自己调用start()触发执行,否则taskExp3_2会一直等待.
其实我们已经发现有点不对劲了,那就是waitFor方法为什么一定要耦合func1,func2,func3的all逻辑呢?
var taskExp3_2 = new Task([func1],[func2],[func3]).all().waitFor(task1, task2).then(lastFunc).start();
这样做是不是更好呢? 答案是肯定的,我们应该设计all(),any(),new Task(),好处是支持了下面几种写法:
//写法一 var taskExp3_2 = new Task([func1],[func2],[func3]).any().waitFor(task1, task2).then(lastFunc).start(); //写法二 var taskExp3_2 = new Task().waitFor(task1, task2).then(lastFunc).start(); //写法三 var task1 = new Task(func1).then([func2],[func3]).all(); //如果没有这个all(),task1的完成就有歧义,是func2,func3都完成才叫完成还是一个完成就叫完成? var task2 = new Task(task1).then(lastFunc).start();
看来在实现waitFor方法之前我们要先实现all(),any(),new Task()这些不传参的方法,同时这些方法的实现要注意什么呢?
var taskExp3_2 = new Task([func1],[func2]).all().then(callback1);
这句代码应该等效于:
var taskExp3_2 = new Task([func1],[func2]).all(callback1);
同时func1,func2返回的参数不能因为all()的执行而传递不到callback1。在下一章我们来实现这些不传参的方法。
相关文章推荐
- 一步一步实现基于Task的Promise库(二)all和any方法的设计和实现
- 一步一步实现基于Task的Promise库(五)waitFor和waitForAny的实现
- 一步一步实现基于Task的Promise库(四)无参数的WorkItem
- 一步一步实现基于Task的Promise库(一)Promise的基本实现
- 基于JSP的RSS阅读器的设计与实现方法(推荐)
- 设计技巧13:工厂方法 Factory method 基于继承 具体实现交给子类来完成
- Spring整合JDBC模板方法设计模式之基于组合的实现
- 基于C++的农夫过河问题算法设计与实现方法
- 基于JSP的RSS阅读器的设计与实现方法(推荐)
- Spring整合JDBC模板方法设计模式之基于继承的实现
- Web站点设计中基于价值的方法
- 基于遗传算法的大规模工程优化设计方法初探
- “方法、设计、实现、管理之三十六计”读后感——《软件工程实践导论》一书的思想方法简析
- 基于STRUTS架构信息系统的设计与实现
- 用C#实现基于查寻字符串的文件行查询器(3)-设计与实现
- 基于XML的配置文件访问接口设计和实现
- 基于混合TCP-UDP的HTTP协议实现方法
- 用 C# 做组件设计时的事件实现方法讨论
- 基于SMO方法的支持向量机Pascal代码实现
- 基于Web的工作流管理系统的设计与实现