2017-10-16 14 views
5

Tôi có ứng dụng Ionic 2 sử dụng navGuard ionViewCanLeave() để hiển thị thông báo xác nhận. Điều này hoạt động tốt; người dùng được hiển thị hộp thoại xác nhận và có thể chọn không rời khỏi nếu họ muốn. Đây là mã cho nó:Làm cách nào tôi có thể lồng ghép 2 lời hứa và có ionViewCanLeave chờ kết quả?

// 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(); 
     }); 
    } 
    } 

Bây giờ tôi cần kiểm tra biến bổ sung tại đây từ storage. Để có được biến đó tôi cần một lời hứa. Mã của tôi như sau:

// 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(); 
     }); 
     } 
    }); 
    } 

Điều gì xảy ra ở đây là trang được bật từ ngăn điều hướng và hộp thoại xác nhận được hiển thị. Có vẻ như ionViewCanLeave() không chờ cuộc gọi lưu trữ chạy vì nó không đồng bộ.

Làm cách nào để giải quyết vấn đề này?

+0

Không liên quan đến câu hỏi của bạn: bạn có chắc những 'điều kiện if' là đúng? Nó không phải là một '||' thay vì một '&& '? Chỉ cần đoán tên của các biến ... – trincot

+0

tôi chỉ muốn nói rằng câu hỏi của bạn đã giúp tôi trong việc ngăn chặn việc rời khỏi trang bằng cách sử dụng alerCtrl, một vấn đề khiến tôi mất 4 ngày để giải quyết, cảm ơn – George

Trả lời

3

Bạn cần phải trả lại lời hứa:

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

Tất nhiên ... . Không thể tin rằng tôi đã bỏ lỡ nó :( – Mike

0

Xin hãy nhìn vào những lời hứa xếp hàng, sử dụng phương pháp Promise.all(). Thông tin

thêm tại 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]); 
}); 
Các vấn đề liên quan