2016-04-13 15 views
8

È possibile ignorare una cattura e tornare alla catena?Promessa: Ignora la cattura e torna alla catena

promiseA()  // <-- fails with 'missing' reason 
    .then(promiseB) // <-- these are not going to run 
    .then(promiseC) 
    .catch(function(error, ignore){ 
    if(error.type == 'missing'){ 
     ignore() // <-- ignore the catch and run promiseB and promiseC 
    } 
    }) 

È possibile qualcosa del genere?

+1

'. Poi' ha 2 argomenti ..' fulfill' e 'reject' .. Puoi gestire' reject' – Rayon

+0

@RayonDabre Grazie per la tua risposta, ma non sono proprio sicuro di cosa intendi. Per favore puoi mostrare un esempio? – Adam

+0

Prende due funzioni come argomenti: quindi (onFulFill, onReject) – Yoda

risposta

11

Ecco l'analogia sincrono:

try { 
    action1(); // throws 
    action2(); // skipped 
    action3(); // skipped 
} catch (e) { 
    // can't resume 
} 

vs

try { 
    action1(); // throws 
} catch (e) { 
    handleError(e); 
} 
action2(); // executes normally 
action3(); 

Ecco la versione promessa:

promiseA()  // <-- fails with 'missing' reason 
.catch(error => { 
    if(error.type == 'missing'){ 
     return; // Makes sure the promise is resolved, so the chain continues 
    } 
    throw error; // Otherwise, rethrow to keep the Promise rejected 
}) 
.then(promiseB) // <-- runs 
.then(promiseC) 
.catch(err => { 
    // Handle errors which are not of type 'missing'. 
}); 

di riferimento futuro: promiseA, promiseB, e promiseC non sono oggetti di promessa effettivi, ma le funzioni che restituiscono promesse (in caso contrario, tutto questo non sarebbe lavoro).

0

Se avete bisogno semplicemente ignorare tutti gli errori in promiseA, si può solo fare in quel modo:

promiseA() 
    .catch(function(error){ 
     //just do nothing, returns promise resolved with undefined 
    }) 
    .then(promiseB) 
    .then(promiseC) 

Se avete bisogno di eseguire promiseB solo quando error.type == 'missing', si può fare:

promiseA()  
    .catch(function(error, ignore){ 
    if(error.type == 'missing'){ 
     return promiseB.then(promiseC) 
    } 
    }) 
+1

Il punto principale che la funzione 'catch' restituisce anche promessa, quindi è possibile utilizzarlo per implementare la logica di fallback e il risultato della catena di esso –

+0

No nested' .then() 'chiama per favore. –

+0

@MadaraUchiha Sì, hai ragione –

Problemi correlati