javascript - 从 bluebird Promise.each() 中调用异步函数

标签 javascript promise bluebird

我有一个异步函数

async hoursTillNextService(aircraft_id, serviceType) {
    var service = await AircraftService.query().where('service_type', serviceType).where('aircraft_id', aircraft_id).orderBy('service_date', 'desc').first()
    if (!service) {
      return null
    }
    var lastDate = service.service_date
    var logs = await Flyinghour.query().where('aircraft_id', aircraft_id).where('flight_start', '>', moment(lastDate).format("YYYY-MM-DD HH:mm:ss")).sum('engine_minutes as totalMinutes')
    return parseInt(((serviceType * 60) - logs[0].totalMinutes) / 60)
  }

我需要在 bluebird.each() 循环中多次调用该函数

async serviceFlyingHoursProfile({ params, view }) {
    var aircraft = await Aircraft.query().where('id', params.id).with('serviceIntervals').first()
    // console.log(aircraft.serviceIntervals())
    var intervals = await aircraft.serviceIntervals().fetch()

    var serviceHourProfile = []
    await Promise.each(intervals.rows, async (interval) => {

      this.hoursTillNextService(aircraft.id, interval.hours).then((hours) => {
        console.log(hours)
        serviceHourProfile.push(hours)
        return
      })
    })
    console.log(serviceHourProfile)
}

结果是

[]
188
99

正如您所看到的,最后一个 console.log 语句是在 Proimise.each() 完成之前调用的,因此我的数组是空的。

最佳答案

您需要await this.hoursTillNextService:

async serviceFlyingHoursProfile({ params, view }) {
    var aircraft = await Aircraft.query().where('id', params.id).with('serviceIntervals').first()
    // console.log(aircraft.serviceIntervals())
    var intervals = await aircraft.serviceIntervals().fetch()

    var serviceHourProfile = []
    await Promise.each(intervals.rows, async (interval) => {

      await this.hoursTillNextService(aircraft.id, interval.hours).then((hours) => {
        console.log(hours)
        serviceHourProfile.push(hours)
        return
      })
    })
    console.log(serviceHourProfile)
}

关于javascript - 从 bluebird Promise.each() 中调用异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56103791/

相关文章:

javascript - 如何使用 Ajax 检查登录情况?

javascript - 制作一个球从屏幕一侧弹起但不弹起的游戏

javascript - 等待 Promise.all 中的 array.map 迭代

javascript - 静态方法 Promise.resolve 上的关键字 new

javascript - D3如何用两个y数据之间的x数据绘制图表

javascript - 在 gulpfile.js 中设置工作目录?

javascript - 同步与立即异步执行性能基准

javascript - promise 链式。等待最后的 promise 解决

javascript - 在 promise 中使用 Async/Awaits

reactjs - 未处理的拒绝提交错误 : Submit Validation Failed