Comment correctement chaîner des promesses conditionnelles (?) Avec Q.js

J'ai pas encore tout à fait arrivés à une compréhension complète de promesses alors, toutes mes excuses si c'est un simple malentendu.

J'ai une fonction pour la suppression d'un élément sur une page mais j'ai un comportement spécifique en fonction de l'état de la page. Pseudo code-sage, il est quelque chose comme ceci:

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

J'espère que ça a du sens. Essentiellement, si il y a des changements, les données doivent être enregistrées en premier. Ensuite, si les données ont été enregistrées, ou s'il n'y avait pas de changements pour commencer, invite l'utilisateur à confirmer la suppression. Le problème est que je suis en utilisant durandal et la brise, et je n'arrive pas à enchaîner les promesses qu'ils reviennent ensemble correctement.

Ma fonction ressemble actuellement, ce que je sais, c'est mal, mais j'ai du mal à résoudre.

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));

L'application.showMessage appel de durandal retourne une promesse, alors la ce.enregistrer retourne une promesse, et, enfin, de la ce.actualiser renvoie également une promesse.

Donc je suppose que j'ai besoin de vérifier la hasChanges, puis, si nécessaire, appeler la méthode save, et de le résoudre.
Puis, après que la condition de la section a fini de se résoudre, à l'appel de la deuxième invite de commandes, puis résoudre toutes les promesses.

Je suis désolé, je ne pense pas que ce soit super clair, mais je pense que venant du fait que je ne suis pas complètement à la suite de la chaînes ici.

Toute aide appréciée! Merci.

source d'informationauteur Adam