这个生成器语法有什么作用?

时间:2017-06-16 23:41:58

标签: javascript ecmascript-6 generator redux-saga

以下语法是什么意思?我不明白在收益后使用*。我是生成器,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声明生成器并为const loadData分配该生成器吗?
  5. Saga库是否在此代码中创建的生成器上调用next()

1 个答案:

答案 0 :(得分:1)

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

yield*用于表示返回的值来自另一个生成器 - 因此调用yield*的生成器函数将实际值创建委托给在这种情况下,另一个生成器函数。

有关详细信息,请参阅MDN on this