2017-07-17 65 views
0

我正在使用REDX傳奇啓動第三方服務,並且我想將錯誤從第三方的回調傳播到傳奇,以便我可以從傳奇中派發適當的操作。我該怎麼做?傳奇中的異步錯誤傳播

在傳奇:

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

在的getProducts:

​​3210

我知道,因爲錯誤正在從異步回調中拋出,我抓不住它在try/catch語句傳奇故事。但是,我只是想知道應該怎樣處理這個問題。

請注意,服務模塊是按原樣構建的,我無法更改其行爲。

任何幫助將是

+0

是否'Service.initialize()'返回一個承諾?如果是,爲什麼你使用'success | error'回調?如果不是 - 爲什麼你將'getProducts'標記爲async,你不'等待'任何東西? –

+0

感謝@YuryTarabanko指出。不,initialize()不返回一個Promise,我編輯了這個問題。 – Hawkes

+0

@YuryTarabanko,對不起,我再次編輯了這個問題,因爲我需要在Promise中包裝getProducts()的成功|錯誤回調以使saga等待它。 – Hawkes

回答

1

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