回答
是的,co可以做到这一点。你必须包裹内co
调用父函数:
co(function *(){
var someVar = yield functionThatReturnsAPromise();
})()
someVar
内将成为解决价值。如果承诺被拒绝,错误可能与基本的try {} catch (e) {}
陈述有关。
对我而言返回'Promise {
对于生成器的调用函数,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的输出,或者甚至向生成器的执行抛出异常。如果承诺一个函数返回一个承诺,可能会产生该承诺的结果,而不是承诺本身。因此,在这种情况下:
var someVar = yield functionThatReturnsAPromise();
^output != ^input
你想要的收益率作为接受一个承诺作为输入,并返回一个解决的承诺作为输出为发电机功能的函数。
恰巧co
能够为你做到这一点。所有你需要做的是饲料的发电机功能的co
功能:
co(function *(){
var someVar = yield functionThatReturnsAPromise();
})
为了更好地理解它是如何工作的,这里是一个函数的例子,做同样的事情作为合作:
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
}
}
source is from Forbes Lindesay's now famous presentation about this concept
*通常,yield对于生成器的调用函数而言,其作用是将相同的值返回到其自己的暂停执行(yield函数的左侧)。在这个简单的例子中,yield的输入是yield函数的输出以及生成器的执行路径*。其实我无法解析这句话。但是,我认为这是错误的。 – 2015-11-29 13:16:50
你不能在你的非生成器函数inc中使用yield。 –
@HåvardGeithus固定 –
- 1. WooCommerce Rest API通过slug获得产品
- 2. 获得通过
- 3. woocommerce产品如何通过产品标签获得订单
- 4. 禁忌和Co-方差 - 通过C#
- 5. 通过HQL获得儿童数量
- 6. 获得通过JavaScript
- 7. 获得通过LINQ
- 8. 获得通过getElementsByName
- 9. 获得通过ID
- 10. 获得通过ID
- 11. 获得通过JSON
- 12. 获得通过AJAX
- 13. 获得通过javascript
- 14. 获得通过MooTools
- 15. 获得通过HTTPS
- 16. 通过店面获得产品的最佳方式
- 17. 我可以通过Reflection获得私人房产的价值吗?
- 18. 如何通过焊接在Java SE中获得ApplicationScoped生产者?
- 19. 通过一次电话获得shopify Metafields产品
- 20. 获得产品从亚马逊特定卖方通过API
- 21. opencart - 通过价格范围获得产品
- 22. Magento - 如何通过产品获得收入
- 23. Mongoose不会产生findeOne结果co
- 24. 获得的产品数量在订单
- 25. 如何获得通过URL发送的变量未知量 - C#
- 26. 获得通过的关键
- 27. 获得通过组SQL
- 28. 如何获得通过setsid
- 29. 获得通过__enter__在__exit__
- 30. 获得通过ID在Scala.js
不,这不是真的'someVar == Promise'。 'somevar'等于通过调用迭代器的函数作为参数传递给'next'的值,它在获得前一个'next'的赋值后。 – 2015-11-29 13:13:39
@torazaburo - 你是对的,但这是一个近2岁的回答问题,你只是增加了噪音......没有与实际问题没有关系的细节无关 –