Angular Promises未定义错误

时间:2017-09-22 14:36:37

标签: javascript angular typescript angular-promise

这是第一次工作承诺我有这个函数返回一个承诺。

  public DatesGenerator(futercampaign: ICampaign, searchparam: any, i: number): ng.IPromise<any> {
    return this.$q((resolve, reject) => {
      let num: number;
      let month: number;
      let tempDate: Date;
      let deadline: Date = new Date(searchparam.start_date);
      let periodicity: Date = new Date(searchparam.start_date);

      if (searchparam.periodicity === 'onemonth') { num = (i * 1); month = 1; } else if (searchparam.periodicity === 'twomonth') { num = (i * 2); month = 2; } else if (searchparam.periodicity === 'threemonth') { num = (i * 3); month = 3; }
      if (searchparam.periodicity === '14') {
        resolve(() => {
          futercampaign.start_date = new Date(periodicity.setDate(periodicity.getDate() + (searchparam.periodicity * i)));

          /* Storing the start_date temporarily */
          tempDate = new Date(futercampaign.start_date);

          /* Calculating the End Date */
          futercampaign.end_date = new Date(tempDate.setDate(tempDate.getDate() + searchparam.periodicity));
        })
      } else {
        resolve(() => {
          futercampaign.start_date = new Date(periodicity.setMonth(periodicity.getMonth() + num));

          /* Storing the start_date temporarily */
          tempDate = new Date(futercampaign.start_date);

          /* Calculating the End Date */
          futercampaign.end_date = new Date(tempDate.getFullYear(), tempDate.getMonth() + month, 0);
        })
      }
      /* Calculating the Deadline */
      futercampaign.deadline = new Date(tempDate.setDate(tempDate.getDate() - searchparam.deadline));

      return futercampaign;

    });

  }

并且已经将它用于其他方法。

      public generateCampaigns(campaing: any, searchparam: any, ev: any): void {

        for (let i: number = 0; i < searchparam.number_campaigns; i++) {
          if (validapps[i]) {
            let copy: any = angular.copy(campaign);
            this.DatesGenerator(copy, searchparam, i).then(()=>{
            if (!searchparam.wildcard) {
              copy.application = validapps[i];
              copy.os = validapps[i].os[0];
              copy.version_app = copy.os.version[0];
              copy.campaing_code = validapps[i].application_code;
            }
            this.suggescampaigns.push(copy);
            });
          }
        }
      }

但是当我调用第二个函数给出错误时,tempDate是未定义的,我不知道为什么,有人可以帮助我。

2 个答案:

答案 0 :(得分:0)

错误正是告诉你的,tempDate是未定义的,因为你在使用它时还没有在这一行解决:

futercampaign.deadline = new Date(tempDate.setDate(tempDate.getDate() - searchparam.deadline));

解决后应该使用它。这意味着在 DatesGenerator 解析中设置futercampaign.deadline并返回 futercampaign 作为承诺的解析。

答案 1 :(得分:0)

原因是因为嵌入在resolve中的嵌入的代码直到函数退出后才会执行,但是在函数结束时,在初始化函数之前,您正在访问未初始化的tempDate变量。 this.$q()方法中的代码将在“稍后某个时间”调用,这很可能是在您的第二个函数退出之后。

由于代码是同步的,因此我不清楚为什么要对此使用承诺。 Promise通常用于可能是异步的代码。你应该删除所有的承诺包装,你可能会得到你想要的东西。