Redux-Saga 调用效果总是在 catch 块结束

Redux-Saga call effect always ends on catch block

我正在使用 Google 翻译 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
  }
}

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, '')
)

那么事情应该正常工作