2015-05-06 5 views
7

Ho guardato le promesse bluebird e come promise.try differisce da un promettente.resolve.quindi quando viene generato un errore. In primo luogo un certo codice usando promise.try dove si genera un errore sincronopromise.try vs promise.resolve gestione degli errori

Promise.try(function() { 
    throw new Error('error'); 
}).catch(function(e) { 
    console.log(e); 
}); 

secondo un codice che getta un errore sincrono sulla determinazione

Promise.resolve().then(function() { 
    throw new Error('error'); 
}).catch(function(e) { 
    console.log(e); 
}); 

Per quanto ne sono consapevole che entrambi si comportano allo stesso. La promessa è essenzialmente un modo più pulito per risolvere la promessa?

La documentazione dice promise.try:

sarà catturare tutti gli errori nei gestori loro promessa .catch invece di dover gestire flussi sia eccezione sincrona e asincrona.

Nel caso dell'esempio dato nei documenti:

function getUserById(id) { 
    return Promise.try(function() { 
     if (typeof id !== "number") { 
      throw new Error("id must be a number"); 
     } 
     return db.getUserById(id); 
    }); 
} 

se l'errore sincrono viene generata verrà mai raggiunto il codice asincrono. Ci sarebbe qualche differenza se si inserisce il codice sopra in un promise.resolve(). Then (..)?

Qualsiasi chiarimento/esempi di promise.try saranno molto apprezzati.

risposta

6

Per quanto ne so, entrambi si comportano allo stesso modo.

Sì, principalmente. Tuttavia, la richiamata .then(…) verrà richiamata in modo asincrono, mentre Promise.try esegue in modo sincrono la propria funzione.

La promessa è essenzialmente un modo più pulito di risolvere la promessa?

Sì, fornisce una notazione più pulita (meno confusa). Ma è più di una ottimizzazione, perché non crea alcun Promise.resolve(undefined) in primo luogo.

9

In aggiunta alla risposta di Bergi: Promise.try è per quelle volte che non è possibile utilizzare Promise.method. L'obiettivo è evitare i casi in cui le eccezioni di sincronizzazione sono miste con i rifiuti.

Generalmente, ogni volta che si sta considerando di utilizzare Promise.try dare un risultato. Promise.method.

var fn = Promise.method(function(){ 
    // can throw or return here, and it'll behave correctly 
}); 

è più o meno lo stesso di:

var fn = function(){ 
    return Promise.try(function(){ 
     // can throw or return here, and it'll behave correctly 
    }); 
});