TypeScript承诺函数问题

时间:2017-02-17 11:04:40

标签: typescript promise ionic2

我正在尝试检查本地存储的数据是否存在,并相应地显示/隐藏部分视图。我这样做是通过为formMarkersDisplay分配true或false,如下所示:

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

问题是this.is_markers被设置为false,即使我期望为true(在console.log中显示)。我一直在努力与Promises合作。我认为这可能与此有关。

如何修改代码才能使其正常工作?

1 个答案:

答案 0 :(得分: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;
  });
}