2017-10-16 3 views
5

J'ai une application Ionic 2 qui utilise le ionViewCanLeave() navGuard pour afficher un message de confirmation. Cela fonctionne bien; l'utilisateur reçoit une boîte de dialogue de confirmation et peut choisir de ne pas partir s'il le souhaite. Voici le code pour elle:Comment puis-je imbriquer 2 promesses et que ionViewCanLeave attende le résultat?

// About to leave 
    ionViewCanLeave() { 
    if(!this.allowedToLeave) { 
     return new Promise((resolve, reject) => { 
     let confirm = this.alertCtrl.create({ 
      title: 'Are you sure?', 
      message: 'Are you sure?', 
      buttons: [{ 
      text: 'OK', 
      handler:() => { 
       this.allowedToLeave = true; 
       resolve(); 
      }, 
      }, { 
      text: 'Cancel', 
      handler:() => { 
       reject(); 
      } 
      }], 
     }); 
     confirm.present(); 
     }); 
    } 
    } 

Je dois maintenant vérifier une variable supplémentaire ici de storage. Pour obtenir cette variable, j'ai besoin d'une promesse. Mon code est le suivant:

// About to leave 
    ionViewCanLeave() { 
    this.storage.get('safe_to_leave').then((val) => { 
     this.safeToLeave = val; 

     if(!this.allowedToLeave && !this.safeToLeave) { 
     return new Promise((resolve, reject) => { 
      let confirm = this.alertCtrl.create({ 
      title: 'Are you sure?', 
      message: 'Are you sure?', 
      buttons: [{ 
       text: 'OK', 
       handler:() => { 
       this.allowedToLeave = true; 
       resolve(); 
       }, 
      }, { 
       text: 'Cancel', 
       handler:() => { 
       reject(); 
       } 
      }], 
      }); 
      confirm.present(); 
     }); 
     } 
    }); 
    } 

Qu'est-ce qui se passe ici cependant, est que la page est de la pile sauté de navigation, puis la boîte de dialogue de confirmation est affichée. Il semble que ionViewCanLeave() n'attend pas l'exécution de l'appel de stockage car il est asynchrone.

Comment puis-je contourner le problème?

+0

Non lié à votre question: êtes-vous sûr de la 'état if' est correct? Ne devrait-il pas s'agir d'un '||' au lieu d'un '&&'? Je devine juste par les noms des variables ... – trincot

+0

Je veux juste dire que votre question m'a aidé à empêcher la sortie de page en utilisant un alerCtrl, un problème qui m'a pris 4 jours à résoudre, merci – George

Répondre

3

Vous devez retourner la promesse:

return this.storage.get(/* ...etc 
^^^^^^        */ 
+0

Bien sûr ... c'est réglé . Je ne peux pas croire que je l'ai raté :( – Mike

0

S'il vous plaît jeter un oeil à des promesses qui font la queue, en utilisant la méthode Promise.all().

Plus d'infos sur link

let promises = []; 

promises.push(asynchroniousFunction); 
promises.push(AnotherAsynchroniousFunction); 

Promise.all(promises).then((results) => { 
    console.log('Data from first method', results[0]); 
    console.log('Data from second method', results[1]); 
}).catch((error) => { 
    console.log('Error from first method', error[0]); 
    console.log('Error from second method', error[1]); 
});