2017-02-17 60 views
0

我試圖檢查本地存儲的數據是否存在,並相應地顯示/隱藏部分視圖。我這樣做,通過分配真假formMarkersDisplay像這樣:TypeScript Promise函數問題

ionViewWillEnter() { 
    this.formMarkersDisplay = this.dataService.isNearMiss(this.appGlobal.getReportPrimaryKey()); 
} 

這裏是isNearMiss功能:

isNearMiss(pk) { 
    let sectionSevenObj : any; 
    this.getReport(pk).then((report) => { 
     if (report) { 
      sectionSevenObj = JSON.parse(report); 
      sectionSevenObj = sectionSevenObj.report.sections.section7; 
      if(Object.keys(sectionSevenObj).length != 0) { 
       this.is_markers = true; 
      } else { 
       this.is_markers = false; 
      } 
     } 
    }); 
    return this.is_markers; 
} 

這裏是getReport:

getReport(pk) { 
    return this.storage.get(pk); 
} 

的問題是,這.is_markers被設置爲false,即使當我期待true時(顯示在console.log中)。我一直在努力讓自己的頭腦與Promises合作。我認爲這可能與此有關。

如何修改我的代碼以使其工作?

+0

您需要返回的承諾,不是變量發生變異 –

+0

有很多你的代碼其它問題以及。例如,這一行的類型註釋不僅毫無意義,而且實際上可以防止TypeScript捕捉錯誤'let sectionSevenObj:any;'。它看起來像你需要刷新你的JavaScript基礎,因爲你正在做的奇怪的事情,例如從同一對象上的方法返回綁定到'this'的值 –

+0

我對JS/TS很新穎。我如何去回覆承諾?我正在尋找我的代碼的實際修訂的一些例子,以指向正確的方向。 – Muhammad

回答

0

是的,你可以使用承諾。代碼中的問題在於它不是阻塞的,所以當你輸入this.getReport()它會執行,然後沿着它返回this.is_makers和它聲明的初始狀態,它不會等待this.getReport()完成。

對於使用的承諾,你可以這樣做:

isNearMiss = (pk: any): Promise<boolean> => { 
    return new Promise<boolean>(ret => { //RET VAR IT'LL RETURN IN CASE OF SUCCESS 
    let sectionSevenObj : any; 
    this.getReport(pk).then((report) => { 
     if (report) { 
     sectionSevenObj = JSON.parse(report); 
     sectionSevenObj = sectionSevenObj.report.sections.section7; 
     if(Object.keys(sectionSevenObj).length != 0) { 
      ret(true); // it'll return true 
     } else { 
      ret(false); 
     } 
     } 
    }); 
    }) 
} 

和修改ionViewWillEnter

ionViewWillEnter() { 
    this.dataService.isNearMiss(this.appGlobal.getReportPrimaryKey()).then(ret =>{ 
    // DO THE CODE IF RET IS TRUE OR FALSE, LIKE SETING this.formMarkersDisplay = ret; 
    }); 
} 
+0

這是完美的!萬分感謝!我明白了這個問題,但是爲了讓語法正確而苦苦掙扎。 – Muhammad