繁体   English   中英

如何在执行下一个之前等待函数完成?

[英]How to await Function to finish before executing the next one?

// 下面的代码已经包含了答案中的建议,因此有效:)

在下面的脚本中,我尝试在最后的 .then 调用开始运行之前完全执行“createDatabase”函数。 不幸的是,我无法找到实现这一目标的解决方案。

一般来说,流程应该如下:

  1. GetFiles - 完全执行它
  2. CreateDatabase - 完全执行它(在开始下一个之前等待每个 .map 调用完成)
  3. 在 .then 调用中退出脚本

非常感谢您的任何建议:)

const db = require("../database")
const fsp = require("fs").promises
const root = "./database/migrations/"

const getFiles = async () => {
  let fileNames = await fsp.readdir(root)
  return fileNames.map(fileName => Number(fileName.split(".")[0]))
}

const createDatabase = async fileNumbers => {
  fileNumbers.sort((a, b) => a - b)
  for (let fileNumber of fileNumbers) {
    const length = fileNumber.toString().length
    const x = require(`.${root}${fileNumber.toString()}.js`)
    await x.create()
  }
}

const run = async () => {
  let fileNumbers = await getFiles()
  await createDatabase(fileNumbers)
}

run()
  .then(() => {
    console.log("Database setup successfully!")
    db.end()
    process.exitCode = 0
  })
  .catch(err => {
    console.log("Error creating Database!", err)
  })

x.create 代码如下所示:

const dbQ = (query, message) => {
  return new Promise((resolve, reject) => {
    db.query(query, (err, result) => {
      if (err) {
        console.log(`Error: ${err.sqlMessage}`)
        return reject()
      }
      console.log(`Success: ${message}!`)
      return resolve()
    })
  })
}

x.create = async () => {
  const query = `
    CREATE TABLE IF NOT EXISTS Country (
      Code CHAR(2) UNIQUE NOT NULL,
      Flag VARCHAR(1024),
      Name_de VARCHAR(64) NOT NULL,
      Name_en VARCHAR(64) NOT NULL,

      Primary Key (Code)
    )`

  const result = await dbQ(query, "Created Table COUNTRY")
  return result
}

如果您希望每个x.create在下一个开始之前完全执行,即这就是我while awaiting each .map call to finish before starting the next所说的解释 - 那么您可以使用 async/await 和 for 循环作为如下:

const createDatabase = async fileNumbers => {
  fileNumbers.sort((a, b) => a - b);
  for (let fileNumber of fileNumbers) {
    const x = require(`.${root}${fileNumber.toString()}.js`);
    await x.create();
  })
}

然而,这也假设x.create()返回一个 Promise - 因为你没有展示.${root}${fileNumber.toString()}.js文件的典型内容是什么,那么我只是投机

您的问题的另一种解释只是要求您更改createDatabase以便promises实际上是一个承诺数组(目前,它是一个undefined的数组

const createDatabase = async fileNumbers => {
  fileNumbers.sort((a, b) => a - b);
  const promises = fileNumbers.map(fileNumber => {
    const x = require(`.${root}${fileNumber.toString()}.js`);
    return x.create();
  })
  await Promise.all(promises);
}

现在,所有.create()在“并行”运行,但createDatabase只解决onces通过返回的所有承诺x.create()决心-再次,假设x.create()返回一个承诺

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM