传奇中的异步错误传播



我正在使用 redux-saga 来启动第三方服务,我想将第三方回调中的错误传播到 saga,以便我可以从 saga 中调度正确的操作。我该怎么做?

在传奇中:

export function * handleFetchProducts () {
try {
const products= yield call(getProducts)
yield put(actions.fetchProductsSuccess(products))
} catch (e) {
yield put(actions.fetchProductsFailure(e))
}
}

在获取产品中:

export async function getProducts() {
return new Promise((resolve, reject) => {
const kc = new Service()
return Service.initialize()
.success((products) => {
resolve(products)
})
.error(() => {
reject(new Error('Couldn't fetch'))
})
}
}

我知道由于错误是从异步回调内部抛出的,因此我无法在 sagas 的尝试/捕获中捕获它。但是,我只是想知道处理这个问题的正确方法是什么。

请注意,服务模块是按原样构建的,我无法更改它的行为。

任何帮助将是

你可以承诺getProducts

export function getProducts() {
return new Promise((resolve, reject) => {
const kc = new Service()
kc.initialize()
.success(resolve)
// this will be caught
.error(() => reject(new Error('...')))
})
}

或者,您可以使用cps效果

export getProducts(next) {
new Service()
.initialize()
.success(products => next(null, products))
.error(() => next(new Error('...')))
}
//and in handleFetchProducts 
try {
const products= yield cps(getProducts)
...
}

最新更新