- 论坛徽章:
- 2
|
回复 5# starwing83
关于Q(以及JS里许多类似物)的设计,我感觉有一个问题。
比如就以Q的readme中的例子来说:
- step1(function (value1) {
- step2(value1, function(value2) {
- step3(value2, function(value3) {
- step4(value3, function(value4) {
- // Do something with value4
- });
- });
- });
- });
复制代码 它忽略了一个重点。
注释部分不仅仅可以Do something with value4之外其实还可以Do something with value1,value2,value3。
并且还可以访问前面几个匿名函数中的局部变量。 只是例子里面被简化了。
并step4也不一定就是使用value3作为实际参数。 它可以使用value2, value1甚至是它们的组合。
而作为对比的例子里面就失去了这个能力:
- Q.fcall(promisedStep1)
- .then(promisedStep2)
- .then(promisedStep3)
- .then(promisedStep4)
- .then(function (value4) {
- // Do something with value4
- })
- .catch(function (error) {
- // Handle any error from all above steps
- })
- .done();
复制代码 每个promisedStep的作用域都是分离的。
因为重心不在JS上所以没有什么实际例子。实际使用中类似管道的结构是大多数? 当遇到不是的时候就必须将前面需要的信息包裹在promise(?)里继续传递下去?
如果promisedStepI是打算被复用的,在实现的时候怎么能预先知道究竟应该传递多少?
而如果整个Q.fcall.then.then...done就是one shot的, 那它与generator或者让那人肉CPS能自动化的方案相比的优势在哪里?
移植性? 可以在不同浏览器对JS高级特性支持参差不齐的情况下也都能够实现? 不依赖某个具体的JS实现(V8,SpiderMonkey,Node,Rhino...)? 也不需要一个以JS为目标的编译器? |
|