如何为生成器函数使用“等待”是 ES6?
Posted
技术标签:
【中文标题】如何为生成器函数使用“等待”是 ES6?【英文标题】:How to use "await" for a generator function is ES6? 【发布时间】:2017-11-20 16:22:21 【问题描述】:问题
我很好奇现代 ES2017 中是否可以在 async/await 上下文中使用 generator-function。 (应用程序是一个 React-native-application)
这是我要调用生成器函数的代码:
class ProductViewComponent extends Component
async componentDidMount()
const result = await loadProduct(...)
console.log(result) // Gives: *Generator* and not the final result
函数loadProduct()
是从另一个文件导入的,定义如下:
export function * loadProduct(id)
let product = yield select(productByIdSelector(id));
if(!product)
// ... yield this
// ... yield that
// ... finally:
product = yield call(loadProductFromWeb, id)
return product;
具体问题:
据我所知,我可以使用 await
来等待 Promises 的结果。在这种情况下如何使用生成器函数?
【问题讨论】:
gen = loadProduct();等待 gen.next(); 显然 .next() 为 loadProduct-Function 中的每个“yield”语句提供了许多结果(里面有很多 yield 语句,比问题中显示的要多) 我还没有得到用例?生成器返回什么?承诺? Migrating from Generators to Async/Await的可能重复 【参考方案1】:从外观上看,它是一个产生(一些)承诺的协程。假设真正的结果只是协程的最后一个结果,并且您无法更改生成器代码,您可以迭代生成器并等待所有内容 - 将等待 Promise 并忽略未定义。
async componentDidMount()
const resultGenerator = loadProduct(...);
let result;
for (let task of resultGenerator)
result = await task ;
console.log(result); // should be last result of coroutine
【讨论】:
你为什么要在这里使用await
?没有它,它应该做同样的事情。
因为它的承诺 - 见call(loadProductFromWeb...
OP 在哪里说它返回承诺?
这是一个有根据的猜测,因为“loadProductFromWeb”以上是关于如何为生成器函数使用“等待”是 ES6?的主要内容,如果未能解决你的问题,请参考以下文章
如何为 Http 触发的 Azure 函数(隔离/进程外)生成 Api 客户端?
如何为所有动态生成的 div 添加常用的 Javascript 函数? [复制]