Non ho ancora avuto una comprensione completa delle promesse così scuse se questo è un semplice fraintendimento.Come concatenare le promesse condizionali (?) Con Q.js
Ho una funzione per eliminare un elemento in una pagina ma ho un comportamento specifico a seconda dello stato della pagina. Psuedo in termini di codice è qualcosa del genere:
Does the page have changes?
If yes - prompt to save changes first
If yes - save changes
If no - exit function
If no - continue
Prompt to confirm delete
If yes - delete item and reload data
If no - exit function
Speriamo che abbia senso. In sostanza se ci sono cambiamenti, i dati devono essere salvati per primi. Quindi, se i dati sono stati salvati o se non sono state apportate modifiche, richiedere all'utente di confermare l'eliminazione. Il problema è che sto usando durandal e brezza, e non riesco a pareggiare le promesse che ritornano insieme correttamente.
Attualmente la mia funzione è simile a questa, che a mio avviso è errata, ma non riesco a capire dove risolverlo.
if (this.hasChanges()) {
app.showMessage('Changes must be saved before removing external accounts. Would you like to save your changes now?', 'Unsaved Changes...', ['Yes', 'No'])
.then(function (selectedOption) {
if (selectedOption === 'Yes') {
return this.save();
} else {
Q.resolve()
}
});
}
app.showMessage('Are you sure you want to delete this item?', 'Delete?', ['Yes', 'No'])
.then(function (selectedOption) {
if (selectedOption === 'Yes') {
item.entityAspect.setDeleted();
datacontext.saveChanges()
.then(function() {
logger.logNotificationInfo('Item deleted.', '', router.activeInstruction().config.moduleId);
Q.resolve(this.refresh(true));
}.bind(this));
}
}.bind(this));
La chiamata app.showMessage da Durandal restituisce una promessa, poi il this.save restituisce una promessa, e, infine, il This.Refresh restituisce anche una promessa.
Quindi suppongo di dover controllare le haschanges, quindi se necessario chiamare save e risolverlo. Quindi dopo che la sezione condizionale ha terminato la risoluzione, chiama il secondo prompt, quindi risolvi tutti i promessi all'interno di quello.
Mi dispiace, non penso che questo sia chiarissimo, ma penso anche che provenga dal fatto che non sto seguendo completamente le catene qui.
Qualsiasi aiuto molto apprezzato! Grazie.
Ho contrassegnato questo come la risposta perché ho praticamente usato tutto questo codice, ma la risposta di tutti era sostanzialmente corretta per quanto ho potuto vedere. – Adam
Per quanto riguarda questa convenzione, so che il "modello" di sé è come dovrebbe essere fatto, ma sfortunatamente ho trovato una situazione in cui non riuscivo a far sì che il sé e le chiusure funzionassero correttamente. Poi l'ho risolto dopo aver scoperto il legame, e si è bloccato perché funzionava. Non buono. – Adam