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

我试图找出如何通过yield来获得承诺的价值,可能与“合作”:

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

被调用的函数不是一个生成器,只是一个正常的函数。 有了上面的一些someVar == Promise ,但我想要解决的价值。 公司或其他图书馆是否有办法做到这一点?

是的, 公司可以做到这一点。 你必须在co呼叫中包装父母function:

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

someVar里面会变成解决的价值。 如果承诺被拒绝,错误可能与基本try {} catch (e) {}语句一致。

通常情况下,yield行为将自己的暂停执行(yield函数的左侧)返回与生成器的调用函数相同的值。 在这个从1到5计数的简单示例中,yield的input是yield函数的输出以及生成器的执行path:

 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 } 

但是,调用函数也可能会调用生成器,但将输出的最后一个输出replace为另一个值,或者甚至向生成器的执行中抛出exception。 在承诺一个函数返回一个承诺的情况下,可能会产生承诺的结果,而不是承诺本身。 所以在这种情况下:

 var someVar = yield functionThatReturnsAPromise(); ^ output != ^ input 

您希望收益率作为一个函数,将承诺作为input,并将已解决的承诺作为输出返回给生成器函数。

它恰好能够为你做到这一点。 所有你需要做的就是把你的发电机function提供给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 } } 

来自福布斯Lindesay现在着名的介绍这个概念