传奇中的异步错误传播

时间:2017-07-17 10:05:55

标签: javascript redux redux-saga

我正在使用redux-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中捕获它。但是,我只是想知道应该采用什么方法处理这个问题。

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

任何帮助都是

1 个答案:

答案 0 :(得分:1)

你可以宣传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)
    ...
}