Javascript sagas中的异步错误传播

Javascript sagas中的异步错误传播,javascript,redux,redux-saga,Javascript,Redux,Redux Saga,我正在使用redux saga来启动第三方服务,我希望将第三方回调中的错误传播到saga,以便我可以从saga中分派适当的操作。我怎样才能做到 在传奇中: export function * handleFetchProducts () { try { const products= yield call(getProducts) yield put(actions.fetchProductsSuccess(products)) } catch (e) { yie

我正在使用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))
  }
}
在getProducts中:

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'))
      })
  }
}
我知道,由于错误是从异步回调内部抛出的,所以我无法在传说中的try/catch中捕捉到它。但是,我只是想知道什么才是正确的处理方法

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


任何帮助都是

您可以承诺
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('...')))
  })
}
或者你也可以使用特效


Service.initialize()
是否返回承诺?如果是,为什么要使用
success | error
回调?如果没有-为什么您将
getProducts
标记为async您不等待
任何东西?感谢@YuryTarabanko指出。不,initialize()不返回承诺,我已编辑了问题。@YuryTarabanko,很抱歉造成混淆,我已再次编辑了问题,因为我需要包装getProducts()的成功|错误回调是的,你需要要么承诺
getProducts
,如果初始化失败,它就会拒绝。或者将
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)
    ...
}