通过 yield & co 获得承诺的价值



我正试图弄清楚如何通过yield获得promise的值,可能使用"co":

function *(){
var someVar = yield functionThatReturnsAPromise();
}

被调用的函数不是生成器,只是一个普通函数。有了上面的someVar == Promise,但我想要解析的值。co或其他图书馆有办法做到这一点吗?

通常情况下,yield操作会向其暂停的执行(yield函数的左侧)返回与生成器的调用函数相同的值。在这个从1到5计数的简单例子中,收益率的输入是收益率对生成器函数以及生成器执行路径的输出:

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作为输出返回给generator函数。

恰好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
}
}

来源于福布斯林赛现在著名的关于概念的介绍

是,co(https://github.com/tj/co)可以做到。您必须将父函数包装在co调用中:

co(function *(){
var someVar = yield functionThatReturnsAPromise();
})()

内部的someVar将成为解析值。如果promise被拒绝,则可以使用基本的try {} catch (e) {}语句来发出错误。

最新更新