【问题标题】:JavaScript: A better way to call multiple async functions in a row?JavaScript:连续调用多个异步函数的更好方法?
【发布时间】:2019-12-17 20:32:17
【问题描述】:

我需要连续调用 4 个等待调用。我目前拥有的工作正常,但对我来说它看起来像是糟糕的代码。有没有更好的方法来写这个?我尝试使用 Promise-chaining,但它看起来比预期的更糟。

adminSchema.statics.generateUsername = async(firstName, lastName) => {
    let generatedUsername = `${firstName}.${lastName}`.toLowerCase()

    let countTracker = 0

    const Count = ((count) => {
        if (count >= 1) {
            count++
            countTracker += count
            console.log("counted")
            console.log(countTracker)
        }
    })

    await Admin.countDocuments({ username: { $regex: new RegExp(generatedUsername) } }, (err, count) => {
        console.log("admin ran")
        Count(count)
    })
    await Teacher.countDocuments({ username: { $regex: new RegExp(generatedUsername) } }, (err, count) => {
        console.log("teacher ran")
        Count(count)
    })
    await Student.countDocuments({ username: { $regex: new RegExp(generatedUsername) } }, (err, count) => {
        console.log("student ran")
        Count(count)
    })
    await Scheduler.countDocuments({ username: { $regex: new RegExp(generatedUsername) } }, (err, count) => {
        console.log("scheduler ran")
        Count(count)
    })

    if (countTracker === 0) {
        generatedUsername = `${firstName}.${lastName}`.toLowerCase()
    } else {
        generatedUsername = `${firstName}.${lastName}.${countTracker}`.toLowerCase()
    }

    console.log(countTracker)
    return generatedUsername
}

【问题讨论】:

  • countDocuments真的返回一个 Promise接受回调吗?
  • 您可以从[Admin, Teacher, Student, Scheduler] 开始,将其映射到Promise 数组,然后使用Promise.all。这样就没有重复的代码了。
  • 好奇:如果你使用callbacks,为什么你有await
  • @ambianBeing 那段代码已经很老了,虽然我还在大量学习新的语法和 MEVN,所以我犯了一些错误。直到你现在才真正注意到它,所以谢谢你:P

标签: javascript mongodb mongoose async-await


【解决方案1】:

用最少的代码运行多个异步调用的一种方法是通过异步 for 循环:

adminSchema.statics.generateUsername = async(firstName, lastName) => {
  let generatedUsername = `${firstName}.${lastName}`.toLowerCase()

  let countTracker = 0

  const Count = ((count) => {
    if (count >= 1) {
      count++
      countTracker += count
      console.log("counted")
      console.log(countTracker)
    }
  })

  /* Merge sequence of model counts into an asynchronous for-loop */
  for(const model of [Admin, Teacher, Student, Scheduler]) {

    /* 
    Evaluate async count() function per loop iteration. This will cause
    count() on each model to be called and completed sequentailly, one-
    after-the-next during iteration of the array. Note also that the
    callback is not needed */
    const count = await model.countDocuments({
      username: {
        $regex: new RegExp(generatedUsername)
      }
    });

    console.log(`${model.name} ran`);
    Count(count);
  }

  if (countTracker === 0) {
    generatedUsername = `${firstName}.${lastName}`.toLowerCase()
  } else {
    generatedUsername = `${firstName}.${lastName}.${countTracker}`.toLowerCase()
  }

  console.log(countTracker)
  return generatedUsername
}

【讨论】:

    猜你喜欢
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 2013-11-06
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    相关资源
    最近更新 更多