我试图弄清楚如何通过 获得承诺的价值yield
,可能是“co”:
function *(){
var someVar = yield functionThatReturnsAPromise();
}
被调用的函数不是生成器,只是一个普通函数。有了上面的someVar == Promise
,但我想要解析的值。co或其他一些图书馆是否有办法做到这一点?
我试图弄清楚如何通过 获得承诺的价值yield
,可能是“co”:
function *(){
var someVar = yield functionThatReturnsAPromise();
}
被调用的函数不是生成器,只是一个普通函数。有了上面的someVar == Promise
,但我想要解析的值。co或其他一些图书馆是否有办法做到这一点?
是的,co可以做到这一点。您必须将父函数包装在co
调用中:
co(function *(){
var someVar = yield functionThatReturnsAPromise();
})()
someVar
inside 将成为解析值。如果 promise 被拒绝,错误可以用基本try {} catch (e) {}
语句来咳嗽。
通常,yield 行为向其自己的暂停执行(yield 函数的左侧)返回与生成器的调用函数相同的值。在这个从 1 到 5 的简单示例中,yield 的输入是生成器函数以及生成器执行路径的输出:
function* inc() {
var g = 0;
while (true) {
g = yield g + 1;
}
}
var incGen = inc();
for (i = incGen.next().value; i <= 5; i = incGen.next(i).value) {
console.log(i); // ^ input of generator is last output
}
但是,调用函数也可能调用生成器,但是将输出最后的 yield 替换为另一个值,甚至抛出异常给生成器的执行。在 Promise 的情况下,返回 Promise 的函数可能会产生该 Promise 的结果,而不是 Promise 本身。所以在这种情况下:
var someVar = yield functionThatReturnsAPromise();
^ output != ^ input
您希望 yield 充当一个函数,该函数将 Promise 作为输入,并将已解决的 Promise 作为输出返回给生成器函数。
碰巧co
能够为您做到这一点。您需要做的就是将您的生成器函数提供给该co
函数:
co(function *(){
var someVar = yield functionThatReturnsAPromise();
})
为了更好地理解它是如何工作的,这里是一个函数的例子,它和 co 做同样的事情:
function async(makeGenerator){
return function (){
var generator = makeGenerator.apply(this, arguments)
function handle(result){
if (result.done) return result.value
return result.value.then(function (res){
return handle(generator.next(res)) // <- sets output of yield to the promise result
}, function (err){ // and returns input promise
return handle(generator.throw(err)) // <- throw promise exception to generator function
})
}
return handle(generator.next()) // <- first time call, input of yield is a promise
}
}