我知道开箱即用Q不会支持这个,但我想知道理论上是否可以做这样的事情:
var user = Q.spawn(function* () {
var createdUser = yield createUser();
return user;
});
console.log(user); // user is available here
答案 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.then
和Q.catch
相反,Q.done
都没有} Q.spawn
也没有任何链接的承诺。
图书馆的作者要么不确定这是不是一个好主意(因此没有想要鼓励它,但也没有实施某些禁止使用的承诺)或完全相信它没有。