gpt4 book ai didi

javascript - 如何依次执行这些函数/在一个函数完全完成后执行这些函数?

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

我有以下函数,但它没有按照我希望的顺序执行。

回调中的 console.log 实际上在函数本身的循环执行之前就被触发了。总而言之,我希望函数“getFiles”在下一个“createDatabase”开始执行之前完全完成。

感谢您的帮助。我已经对这个问题发疯了:(

const fs = require("fs")
let data = []

const getFiles = () => {
fs.readdir("./database/test/", (err, files) => {
files.forEach(file => {
require("../database/test/" + file)
data.push(Number(file.split(".")[0]))
console.log(data)
})
})
}

const createDatabase = () => {
data.sort((a, b) => {
return a-b
})
console.log(data)
// Do some other stuff
}


const run = async () => {
await getFiles
await createDatabase()
process.exitCode = 0
}

run()

最佳答案

使用较新的 fs.promises 接口(interface)进行编码相当简单,因此您可以await readdir() 输出:

const fsp = require('fs').promises;
const path = require('path');

const async getFiles = () => {
const root = "./database/test/";
let files = await fsp.readdir(root);
return files.map(file => {
require(path.join(root, file));
return Number(file.split(".")[0]);
});
}

const createDatabase = (data) => {
data.sort((a, b) => {
return a-b
})
console.log(data)
// Do some other stuff
}

const run = async () => {
let data = await getFiles();
createDatabase(data);
process.exitCode = 0
}

run().then(() => {
console.log("all done");
}).catch(err => {
console.log(err);
});

变更摘要:

  1. 使用 fs.promises 接口(interface),以便我们可以等待readdir()的结果。
  2. getFiles() 更改为 async,以便我们可以使用 await,这样它就会返回一个 promise ,当所有异步工作完成时,该 promise 就会得到解决完成了。
  3. data 移至函数中(从 getFiles() 解析并传递给 createDatabase()),而不是作为顶级变量由多个功能共享。
  4. 跟踪调用 run() 的完成情况和错误
  5. 实际上是在 run() 中调用 getFiles(),并在其后面加上括号。

关于javascript - 如何依次执行这些函数/在一个函数完全完成后执行这些函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59514430/

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