Javascript 如何在一个接一个/一个完全完成后执行这些功能?
我有以下函数,它没有按照我希望的顺序执行 回调函数中的console.log实际上在函数本身中的循环执行之前被触发。总之,我希望函数“getFiles”在下一个“createDatabase”开始执行之前完全完成 谢谢你的帮助。 我已经对这个问题发疯了:(Javascript 如何在一个接一个/一个完全完成后执行这些功能?,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我有以下函数,它没有按照我希望的顺序执行 回调函数中的console.log实际上在函数本身中的循环执行之前被触发。总之,我希望函数“getFiles”在下一个“createDatabase”开始执行之前完全完成 谢谢你的帮助。 我已经对这个问题发疯了:( 该问题与对异步代码使用forEach循环有关。此答案对此问题有更多说明: 我不太确定您到底想做什么,但问题似乎出在您的run函数中。您没有在run中调用getFiles函数。您只关心函数名。还需要将getFiles包装成它应该是的样子 con
该问题与对异步代码使用forEach循环有关。此答案对此问题有更多说明:
我不太确定您到底想做什么,但问题似乎出在您的run函数中。您没有在run中调用getFiles函数。您只关心函数名。还需要将
getFiles
包装成它应该是的样子
const run = async () => {
await getFiles();
await createDatabase();
process.exitCode = 0
}
这对于使用较新的
fs.promises
接口进行编码非常简单,因此您可以等待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);
});
更改摘要:
使用fs.promises接口,以便我们可以等待readdir()的结果
将getFiles()
更改为async
,这样我们就可以使用await
,这样它会返回一个承诺,当所有异步工作完成时,该承诺就会得到解决
将数据
移动到函数中(从getFiles()
解析并传递到createDatabase()
),而不是多个函数共享的顶级变量
跟踪调用run()
在run()
中,实际调用getFiles()
,并在后面加上参数
下面的代码段将首先完全运行getFiles函数,然后运行createDatabase函数。要使用async/await,函数需要返回承诺(阅读关于承诺的内容)
由于createDatabase函数现在没有返回任何承诺,您可以删除它前面的Wait。只有在承诺返回时才使用Wait。您可以阅读async/Wait。我不确定Wait关键字是如何工作的,但为什么您要使用getFiles
然后使用createDatabase()
(括号内),它们不是都是函数吗?等待getFiles
1。这将不会执行函数2。即使执行函数,也不会返回承诺,因此等待它是没有用的。缺少的括号是一个输入错误。对此表示抱歉。getFiles()
不会返回链接到它的完成的承诺,因此执行等待getFiles()
不会等待它完成。这仍然不能确保在执行createDatabase
之前执行getFiles
中的所有操作。为了实现“getFiles”,必须更改哪些操作在调用“createDatabase”之前被完全执行?我的错是,我看了某个人在其中一个答案中编写的代码,而不是原来用Promise包装getFiles的帖子。太棒了,非常感谢:)这正是我回到正轨所需要的:)[我很想对你的答案投赞成票,但现在还不允许这样做:(]嘿@jfriend00,你的代码运行得很好。不幸的是,我现在无法将同步.map调用设置为“做一些其他事情”。我希望它在脚本末尾的.then函数开始运行之前完全执行。已经用不同的方法尝试过了,但控制台.log(“全部完成”)始终在.map函数完成之前执行:(有什么想法吗?@Architecd-听起来像是在.map()中执行了一个异步操作,.map()不支持异步。我建议在实际代码中发布一个新问题。非常感谢:)这也很有吸引力,并清楚地解释了我如何修改代码以使其在将来正常工作。@Architecd很高兴能够提供帮助。还有一个更新,即使用try-catch块使用async/await进行错误处理。嗨,Elllgeemm,欢迎使用Stack Overflow!请引用您链接到的答案的相关部分,以便此答案可以继续独立完成。
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);
});
const fs = require("fs")
let data = []
const getFiles = () => {
return new Promise((resolve, reject) => {
fs.readdir("./database/test/", (err, files) => {
if (err) {
reject(err);
}
files.forEach(file => {
require("../database/test/" + file)
data.push(Number(file.split(".")[0]))
console.log(data)
})
resolve(true);
})
})
}
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()