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, '')
)
那么事情应该正常工作。
我正在使用 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, '')
)
那么事情应该正常工作。