2017-07-17 1 views
0

Ich benutze Redux-Saga, um einen Drittanbieter-Dienst zu initiieren, und ich möchte die Fehler aus dem Rückruf des Drittanbieters in die Saga propagieren, damit ich ordnungsgemäße Aktionen aus der Saga versenden kann. Wie kann ich das tun?Async Fehlerfortpflanzung in Sagas

In Sagas:

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

In 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')) 
     }) 
    } 
} 

Ich weiß, dass da der Fehler aus dem Inneren eines Asynchron-Rückruf geworfen wird, kann ich es nicht fangen im try/catch der Sagas. Aber ich wollte nur wissen, was der richtige Weg ist, damit umzugehen.

Bitte beachten Sie, dass das Service-Modul unverändert aufgebaut ist und ich sein Verhalten nicht ändern kann.

Jede Hilfe wäre

+0

Hat 'Service.initialize()' Rückkehr ein Versprechen verwenden könnte? Wenn ja, warum verwenden Sie 'Erfolg | Fehler' Callbacks? Wenn nein - warum markierst du 'getProducts' als Async, du" erwartest "nichts? –

+0

Danke @YuryTarabanko für Hinweise. Nein, initialize() gibt kein Promise zurück, ich habe die Frage bearbeitet. – Hawkes

+0

@YuryTarabanko, Entschuldigung für die Verwirrung, ich habe die Frage erneut bearbeitet, da ich die Erfolg | Fehlerrückrufe der getProducts() in einem Versprechen wickeln müsste, um Saga darauf warten zu lassen. – Hawkes

Antwort

1

Sie sich 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('...'))) 
    }) 
} 

Alternativ promisify könnten Sie cps Effekt

export getProducts(next) { 
    new Service() 
    .initialize() 
    .success(products => next(null, products)) 
    .error(() => next(new Error('...'))) 
} 

//and in handleFetchProducts 

try { 
    const products= yield cps(getProducts) 
    ... 
} 
Verwandte Themen