JavaScript:连续调用多个异步函数的更好方法?

时间:2019-08-10 10:16:04

标签: javascript mongodb mongoose async-await

我有4个等待呼叫,需要连续拨打。我目前所拥有的一切都很好,但对我来说看起来像是不好的代码。有没有更好的方法来写这个?我尝试过使用诺言链,但是看起来比预期的要糟糕。

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
}

1 个答案:

答案 0 :(得分: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
}