首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何实现异步循环(JS)

如何实现异步循环(JS)
EN

Stack Overflow用户
提问于 2018-08-02 05:00:00
回答 1查看 75关注 0票数 1

我有一个for each循环,我在其中检查一些东西。此检查是异步的,当此检查为false时,我希望中断循环。下面是我的代码:

代码语言:javascript
复制
addReservation(reservation: Reservation) {
    this.deskService.loadDesksWhereRangeGreater(reservation.persons).subscribe(
        desks => {
            if (desks.length > 0) {

                for (const desk1 of desks) {
                    console.log('checking');
                    if (this.checkForAvailability(desk1, reservation)) {
                        console.log('found');
                    }
                }
            }
        }
    );
}

async checkForAvailability(desk: Desk, reservation: Reservation) {

    await this.db.collection('Desks').doc(desk.id)
    .collection('Reservations', ref => ref.where('timestamp', '<=', reservation.timestamp + this.reservationDelta)
    .where('timestamp', '>', reservation.timestamp - this.reservationDelta))
    .valueChanges().subscribe(reservations => {
        if (reservations.length === 0) {
            console.log('reservation possible for ' + desk.nr);
            return true;
        } else {
            console.log(desk.nr + ' Belegt');
            return false;
        }
    });
}

然而,await部件并不能真正工作。它只是在循环中迭代,而不是在每次迭代中等待异步函数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-02 05:16:20

你需要从checkForAvailabilityawait出结果

代码语言:javascript
复制
addReservation(reservation: Reservation) {
    this.deskService.loadDesksWhereRangeGreater(reservation.persons).subscribe(
        async desks => {
            if (desks.length > 0) {
                for (const desk of desks) {
                    const available = await this.checkForAvailability(desk, reservation)
                    if (!available) { break }
                }
            }
        }
    );
}

checkForAvailability(desk: Desk, reservation: Reservation) {
  // here, you need to return a promise
  return new Promise(resolve => {
    this.db.collection('Desks').doc(desk.id)
    .collection('Reservations', ref => ref.where('timestamp', '<=', reservation.timestamp + this.reservationDelta)
    .where('timestamp', '>', reservation.timestamp - this.reservationDelta))
    .valueChanges().subscribe(reservations => {
      resolve(reservations.length === 0)
    });
  })
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51642187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档