【问题标题】:Redux-Saga call effect always ends on catch blockRedux-Saga 调用效果总是在 catch 块上结束
【发布时间】:2021-08-30 23:51:28
【问题描述】:

我在用一些数据填充存储之前使用 Google Translate API 和翻译文本,但是使用 call() 效果来翻译效果,即使翻译请求成功,响应也总是进入 catch 块

这是我的传奇:

function* getResults({ payload = 'user' }: ActionType<typeof actions.getResultsRequest>) {
  try {
    const { data } = yield call(api, `/results/${payload === 'user' ? 'me' : 'team'}`);
    const currentLanguage = getSavedState('user.currentLanguage')
    if (currentLanguage !== "ptBR") {
      const { results: statistics, adequate_protection, ...rest } = data
      const translatedProtection: ReturnType<typeof translateText> = yield call(translateText(data.adequate_protection, currentLanguage.replace(/[^a-z]/g, '')))
      yield put(actions.getResultsSuccess({ statistics, analysis: { ...rest, adequate_protection: translatedProtection } }));
    } else {
      const { results: statistics, ...rest } = data
      yield put(actions.getResultsSuccess({ statistics, analysis: { ...rest } }));
    }
  } catch (error) {
    yield put(actions.getResultsFailure({ status: true, message: 'Ocorreu um erro' }))
  }
}

这是translateText()

export const translateText = async (
  text: string | Array<string>,
  targetLanguage: string
) => {
  try {
    const [response] = await translate.translate(text, targetLanguage)
    let result: string | Array<string> = response

    if (Array.isArray(response)) {
      result = response.map((val: string, index) =>
        val !== '' ? val : text[index]
      )
    }
    return result
  } catch (error) {
    console.error('Error translate api =>', `${error}`)
    return text
  }
}

【问题讨论】:

    标签: reactjs typescript redux redux-saga


    【解决方案1】:

    call 接受一个函数及其参数,但您调用 translateText 并将生成的Promise 传递给call。您得到的error 可能是TypeError,表示Promise 类型的参数fn 不是callable。

    如果你改变:

    yield call(
      translateText(data.adequate_protection,
      currentLanguage.replace(/[^a-z]/g, ''))
    )
    

    到:

    yield call(
      translateText,
      data.adequate_protection,
      currentLanguage.replace(/[^a-z]/g, '')
    )
    

    那么事情应该正常工作。

    【讨论】:

      猜你喜欢
      • 2021-11-21
      • 2017-09-17
      • 2021-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-21
      • 1970-01-01
      相关资源
      最近更新 更多