是否有可能使像Q.spawn这样的方法在Node JS中返回一个值

时间:2014-05-01 19:45:45

标签: node.js asynchronous generator q

我知道开箱即用Q不会支持这个,但我想知道理论上是否可以做这样的事情:

var user = Q.spawn(function* () {
    var createdUser = yield createUser();
    return user;
});

console.log(user); // user is available here

1 个答案:

答案 0 :(得分:0)

我可能错了,但我会说是的,从理论上来说,它可能不是那样的。这就是Q为什么不支持它的原因。

我不确定为什么Q.done完全无效承诺链,阻止进一步调用p.then成功(也许这是不可能的),但是现在(Q在撰写本文时为1.2.0版)它没有:

var p = Q("Test");
p.done();
p.then(function(message) {
    console.log(message); // "Test" is logged here just fine.
});
// No runtime errors.

所以Q.spawn只需要在调用Q.async(generator)()之后返回Q.done的结果来支持它,就像这样:

Q.spawn = spawn;
function spawn(makeGenerator) {
    var p = Q.async(makeGenerator)();
    Q.done(p);
    return p;
}

也就是说,我似乎很清楚,API并不想鼓励使用完成的承诺链:例如,与Q.thenQ.catch相反,Q.done都没有} Q.spawn也没有任何链接的承诺。

图书馆的作者要么不确定这是不是一个好主意(因此没有想要鼓励它,但也没有实施某些禁止使用的承诺)或完全相信它没有。