Socket.io + co: 就应该这样使用吗?

Socket.io + co: Is this how it's supposed to be used?

我正在尝试获取 http://socket.io/ working with co

我正在尝试在我的代码中异步执行一些任务。

io.on('connection', function (socket) {

    // <--- need to do something heavy here

    socket.on('something', function (data) {

        // <--- need to do something heavy here

    });

    // <--- need to do something heavy here

});

这就是 socket.io 的工作原理。我现在想将 co 添加到组合中。我尝试了以下方法:

io.on('connection', function (socket) {
    co(function* () {

        yield something(); // <--- this works

        socket.on('something', function (data) {

            yield something(); // <--- this does not work

        });

        yield something(); // <--- this works
    });
});

得到这个错误:SyntaxError: Unexpected strict mode reserved word

还有这个:

io.on('connection', function (socket) {
    co(function* () {

        yield something(); // <--- this works

        socket.on('something', function (data) {

            co(function* () {
                yield something(); // <--- this works
            });

        });

        yield something(); // <--- this works
    });
});

我的问题是,它应该如何使用,还是我错过了什么。包装所有内容似乎需要大量额外代码?

于是又想了想

io.on('connection', co.wrap(function *(socket) {

    yield something();

    socket.on('something', co.wrap(function *(data) {

        yield something();

    }));

    yield something();
}));

这应该可以解决问题。包装 returns 一个函数,然后 return 一个 Promise。这里我们不关心后者。 Co Documentation On Co.wrap