gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:12:30 27 4
gpt4 key购买 nike

//下面的代码已经包含答案中的建议,因此可以工作:)

在下面的脚本中,我尝试在最后的 .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 在下一个开始之前完全执行,即这就是我在等待每个 .map 调用完成后再开始下一个之前所说的内容 - 那么你可以将 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实际上是一个promise数组(目前,它是一个数组>未定义

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 仅解析一次 x.create() 返回的所有 promise 解析 - 再次假设 x.create() 返回一个 promise

关于javascript - 如何在执行下一个函数之前等待函数完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59515795/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com