Che cosa c'è che non va?
Ma il modello funziona!
Sei fortunato. Sfortunatamente, probabilmente non lo è, come probabilmente hai dimenticato un caso limite. In più della metà delle occorrenze che ho visto, l'autore ha dimenticato di occuparsi del gestore degli errori:
return new Promise(function(resolve) {
getOtherPromise().then(function(result) {
resolve(result.property.example);
});
})
Se l'altra promessa viene respinta, ciò accadrà inosservato invece di essere propagato alla nuova promessa (dove verrebbe gestita) - e la nuova promessa rimane in sospeso per sempre, il che può causare perdite.
La stessa cosa accade nel caso in cui il codice di callback provochi un errore, ad esempio quando result
non property
è presente un'eccezione. Ciò non verrebbe gestito e lascerebbe irrisolta la nuova promessa.
Al contrario, l'utilizzo si .then()
occupa automaticamente di entrambi questi scenari e rifiuta la nuova promessa quando si verifica un errore:
return getOtherPromise().then(function(result) {
return result.property.example;
})
L'antipasto differito non è solo ingombrante, ma anche soggetto a errori . L'uso .then()
per il concatenamento è molto più sicuro.
Ma ho gestito tutto!
Veramente? Buona. Tuttavia, questo sarà abbastanza dettagliato e abbondante, soprattutto se si utilizza una libreria promessa che supporta altre funzionalità come la cancellazione o il passaggio di messaggi. O forse lo farà in futuro, o vuoi scambiare la tua libreria con una migliore? Non vorrai riscrivere il tuo codice per questo.
I metodi delle librerie ( then
) non solo supportano nativamente tutte le funzionalità, ma potrebbero anche avere determinate ottimizzazioni. Il loro utilizzo renderà probabilmente il tuo codice più veloce o almeno consentirà di essere ottimizzato da future revisioni della libreria.
Come lo evito?
Quindi, ogni volta che ti ritrovi a creare manualmente una Promise
o Deferred
e già esistenti promesse, controlla prima l'API della libreria . L'antipasto differito viene spesso applicato da persone che vedono le promesse [solo] come un modello di osservatore - ma le promesse sono più che richiami : dovrebbero essere compostabili. Ogni biblioteca decente ha molte funzioni facili da usare per la composizione delle promesse in ogni modo pensabile, prendendosi cura di tutte le cose di basso livello che non vuoi affrontare.
Se hai trovato la necessità di comporre alcune promesse in un modo nuovo che non è supportato da una funzione di aiuto esistente, scrivere la tua funzione con inevitabili rinvii dovrebbe essere l'ultima opzione. Considera di passare a una libreria più ricca di funzionalità e / o di presentare un bug sulla tua libreria corrente. Il suo manutentore dovrebbe essere in grado di derivare la composizione dalle funzioni esistenti, implementare una nuova funzione di supporto per l'utente e / o aiutare a identificare i casi limite che devono essere gestiti.
getStuffDone
wrapper di funzione e usare solo il valore letterale Promise?