2017-02-17 59 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