这是第一次工作承诺我有这个函数返回一个承诺。
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是未定义的,我不知道为什么,有人可以帮助我。
答案 0 :(得分:0)
错误正是告诉你的,tempDate是未定义的,因为你在使用它时还没有在这一行解决:
futercampaign.deadline = new Date(tempDate.setDate(tempDate.getDate() - searchparam.deadline));
解决后应该使用它。这意味着在 DatesGenerator 的解析中设置futercampaign.deadline
并返回 futercampaign 作为承诺的解析。
答案 1 :(得分:0)
原因是因为嵌入在resolve中的嵌入的代码直到函数退出后才会执行,但是在函数结束时,在初始化函数之前,您正在访问未初始化的tempDate变量。 this.$q()
方法中的代码将在“稍后某个时间”调用,这很可能是在您的第二个函数退出之后。
由于代码是同步的,因此我不清楚为什么要对此使用承诺。 Promise通常用于可能是异步的代码。你应该删除所有的承诺包装,你可能会得到你想要的东西。