【问题标题】:What does this generator syntax do?这个生成器语法有什么作用?
【发布时间】:2017-11-19 19:51:12
【问题描述】:

以下语法是什么意思?我不明白在收益后使用*。我是 generators、redux 和 sagas 的新手,所以我希望能帮助我理解 *takeEvery()return function *(action) { 的语法的作用:

var MIDDLEWARES = []

function builder( ) {
    const LOAD_DATA = "POI_LOADER/LOAD_POIS"
    MIDDLEWARES.push( function *sagaFunction() {
        yield *takeEvery( LOAD_DATA, loadData( statusField) )
    } )
}

const loadData = (statusField) => {
    return function *(action) {
        console.log("action.venueId = " + action.venueId)
    }
}

这里有几个问题:

  1. yield *takeEvery() 中的* 是什么意思?好像是Delegated yield (yield star, yield *) in generator functions回答的。
  2. 既然 builder() 函数包含 yield * 语句,为什么它不需要 * 来使其成为生成器?那是因为yield *takeEvery() 被包裹在生成器函数sagaFunction() 中吗?
  3. takeEvery() 函数有什么作用,特别是考虑到它前面有一个*?我认为takeEvery()。基于其documentation,我认为它将loadData() 应用于LOAD_DATA 中的所有内容。但是如果LOAD_DATA 不是一个数组,那么这段代码中是否需要takeEvery()
  4. 为什么声明return function *(action) 似乎没有函数名称?是否使用输入参数 action 声明生成器并将该生成器分配给称为 loadDataconst
  5. Saga 库是否在此代码中创建的生成器上调用 next()

【问题讨论】:

  • 这样合法吗?看起来很奇怪。 * 是关键字的一部分,即它是 function*yield*。我不知道允许空格,这太疯狂了。

标签: javascript ecmascript-6 generator redux-saga


【解决方案1】:

因此生成器允许使用 yield 从生成器函数返回一个值,然后在下一次调用时从那里恢复执行。

yield* 用于表示返回的值来自另一个生成器 - 因此调用 yield* 的生成器函数委派将实际值创建给另一个 本例中的生成器函数。

请参阅MDN on this 了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 2012-04-02
    • 1970-01-01
    相关资源
    最近更新 更多