我使用的是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/

10-12 00:04
查看更多