通过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现在着名的介绍这个概念