Javascript forEach中的Promise和变量引用

Javascript forEach中的Promise和变量引用,javascript,cordova,typescript,ionic-framework,promise,Javascript,Cordova,Typescript,Ionic Framework,Promise,我正在尝试使用Ionic(Cordova)制作一个简单的日历应用程序。我希望有一个日历事件列表,每个事件旁边都有一个按钮,允许用户将事件添加到他/她的日历中,或者如果已经存在,则将其删除。此外,我还添加了一个按钮,将所有事件添加到日历中,以便于使用 我的问题是在forEach中使用承诺。让我从Cordova(爱奥尼亚)应用程序的代码开始: addAllEvents()应该做的是(在按下页面上的按钮时)将事件数组中的所有CalendarEvents添加到用户的日历中,并将事件的isInCalend

我正在尝试使用Ionic(Cordova)制作一个简单的日历应用程序。我希望有一个日历事件列表,每个事件旁边都有一个按钮,允许用户将事件添加到他/她的日历中,或者如果已经存在,则将其删除。此外,我还添加了一个按钮,将所有事件添加到日历中,以便于使用

我的问题是在forEach中使用承诺。让我从Cordova(爱奥尼亚)应用程序的代码开始:

addAllEvents()
应该做的是(在按下页面上的按钮时)将事件数组中的所有CalendarEvents添加到用户的日历中,并将事件的isInCalendar属性更新为true<代码>iIncalendar用于决定在每个事件旁边显示哪个按钮(添加或删除):


日历解析返回的承诺时,事件对象引用事件数组中的最后一项,这意味着承诺仅修改最后一个事件。不,这不会发生。问题一定出在别处了。谢谢!我很好奇我的“理论”是否正确。我希望有人知道到底发生了什么。不,
forEach
不会这样做。带有
var事件的
for
循环可以做到这一点。顺便说一句,不要在承诺中使用
forEach
(实际上根本不要使用
forEach
)。改为使用
Promise.all(array.map(…)
。如果
createEvent
返回事件
Promise.all(this.events.map(e=>Calendar.createEvent(e.title,e.location,…)。然后(createdEvents=>createdEvents.forEach(e=>e.isInCalendar=true))
addAllEvents() {
  this.events.forEach((event: CalendarEvent, index, array) => {

    Calendar.createEvent(event.title, event.location, event.notes, event.startDate, event.endDate).then(
      (msg) => {
        console.log(msg);
        event.isInCalendar = true;
      },
      (err) => {
        console.log(err);
      }
    );

  });
}
<button *ngIf="!event.isInCalendar;" ion-button rounded (click)="addEventToCalendar(i);">Add to calendar</button>
<button *ngIf="event.isInCalendar;" ion-button color="danger" rounded (click)="removeEventFromCalendar(i);">Remove from calendar</button>
addEventToCalendar(index: number) {
    let event = this.events[index];
    Calendar.createEvent(event.title, event.location, event.notes, event.startDate, event.endDate).then(
      (msg) => {
        console.log(msg);
        event.isInCalendar = true;
      },
      (err) => {
        console.log(err);
      }
    );
  }

removeEventFromCalendar(index: number) {
    let event = this.events[index];
    Calendar.deleteEvent(event.title, event.location, event.notes, event.startDate, event.endDate).then(
      (msg) => {
        console.log(msg);
        event.isInCalendar = false;
      },
      (err) => {
        console.log(err);
      }
    );
}