我使用的是io.js,它是已经支持ES6生成器且不需要特殊标志的节点的分支,以及Kris Kowal的Q库。
我正在做的是一个游戏脚本,其中几乎每个动作都是异步的,并且我使用Q.spawn
使事情保持理智。这是我的代码的当前状态,并且可以正常工作:
var q = require('q');
var tw = require('./lib/typewriter');
q.spawn(function*() {
tw.clear();
yield tw.type({d:100}, "August 3, 9:47 AM", {w:500});
yield tw.type("District Court");
yield tw.type("Defendant Lobby No. 2", {w:2000});
yield tw.breakLine();
yield tw.type({who:"Phoenix"}, {dh:true}, {d:30}, "(Boy am I nervous!)", {w:1500});
yield tw.breakLine().then(function(){ throw new Error("BOOM!"); });
yield tw.type({who:"Mia"}, {dh:true}, {d:40}, "Wright!", {w:1250});
yield tw.type({di:true}, {d:50}, "Did you", {w:1000}, {d:0}, " ", {d:30}, "turn off the lights?", {w:1000});
yield tw.type({di:true}, {d:400}, ". . .", {w:1000});
yield tw.type({di:true}, {d:40}, "I can't see a thing!", {w:1000});
yield tw.breakLine();
process.exit();
});
但是,将收益增加到每条生产线上都很糟糕。我几乎要跳向Luvit,以摆脱这种疯狂,但是我给了JavaScript机会。
在正常情况下,我可以忽略大多数的屈服,如下所示:
var q = require('q');
var tw = require('./lib/typewriter');
q.spawn(function*() {
tw.clear();
tw.type({d:100}, "August 3, 9:47 AM", {w:500});
tw.type("District Court");
tw.type("Defendant Lobby No. 2", {w:2000});
tw.breakLine();
tw.type({who:"Phoenix"}, {dh:true}, {d:30}, "(Boy am I nervous!)", {w:1500});
tw.breakLine();
tw.type({who:"Mia"}, {dh:true}, {d:40}, "Wright!", {w:1250});
tw.type({di:true}, {d:50}, "Did you", {w:1000}, {d:0}, " ", {d:30}, "turn off the lights?", {w:1000});
tw.type({di:true}, {d:400}, ". . .", {w:1000});
tw.type({di:true}, {d:40}, "I can't see a thing!", {w:1000});
yield tw.breakLine();
process.exit();
});
为了确保
process.exit()
不会太早执行,仍然只有一个产量。打字机模块实际上将大多数命令排队,因此可以正常工作。这是合理的。但是,如果回调抛出某处,例如:
tw.breakLine().then(function(){ throw new Error("BOOM!"); });
然后,Q将吞并它,并且由于该承诺没有附加
catch
处理程序,因此它将被无声地垃圾收集。如果JavaScript生成器仅检测到产生诺言并自动产生诺言的表达式语句,那将是很棒的(当然,只要您可以选择退出它即可)。
是否有执行此操作的JavaScript预处理程序?
还是有其他方法可以避免在每一行上显式地屈服,但仍然可以捕获异常?
最佳答案
如果JavaScript生成器仅检测到产生诺言并自动产生诺言的表达式语句,那就太好了。
It would be terrible。
还是有其他方法可以避免在每一行上显式地屈服,但仍然可以捕获异常?
并不是的。但是对于您的用例,我建议使用异步帮助器函数来减少要使用的yield
的数量:
var paragraph = q.async(function*(lines) {
for (let line of lines)
yield tw.type(...line);
yield tw.breakLine();
});
q.spawn(function*() {
tw.clear();
yield paragraph([
[{d:100}, "August 3, 9:47 AM", {w:500}],
["District Court"],
["Defendant Lobby No. 2", {w:2000}]
]);
yield paragraph([
[{who:"Phoenix"}, {dh:true}, {d:30}, "(Boy am I nervous!)", {w:1500}]
]);
throw new Error("BOOM!");
yield paragraph([
[{who:"Mia"}, {dh:true}, {d:40}, "Wright!", {w:1250}],
[{di:true}, {d:50}, "Did you", {w:1000}, {d:0}, " ", {d:30}, "turn off the lights?", {w:1000}],
[{di:true}, {d:400}, ". . .", {w:1000}],
[{di:true}, {d:40}, "I can't see a thing!", {w:1000}]
]);
process.exit();
});
关于javascript - 避免在类似协程的JavaScript函数中进行“屈服”重复,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29767548/