如何为生成器函数使用“等待”是 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 函数? [复制]

Plotly:如何为使用多条轨迹创建的图形设置调色板?

在反应状态引擎中,如何为结果表的每一行生成唯一的 UUID?

如何为 Presto 编写自定义窗口函数?

如何为同一个类对象的成员函数保留单独的变量副本?