Javascript 函数不会等待它们被解析
我试图一次一个地按顺序执行函数。使用承诺,我相信它应该有效,但对我来说,它不起作用。我做了一些研究,发现其中一个答案解释了如何使用承诺,这就是我一直试图做的 以下是功能:Javascript 函数不会等待它们被解析,javascript,promise,async-await,Javascript,Promise,Async Await,我试图一次一个地按顺序执行函数。使用承诺,我相信它应该有效,但对我来说,它不起作用。我做了一些研究,发现其中一个答案解释了如何使用承诺,这就是我一直试图做的 以下是功能: async function loadCommands () { return new Promise((resolve, reject) => { let commands = 0; readdir('./commands/', (error, files) => { if (er
async function loadCommands () {
return new Promise((resolve, reject) => {
let commands = 0;
readdir('./commands/', (error, files) => {
if (error) reject(error);
for (const file of files) {
if (!file.endsWith('.js')) return;
commands++;
}
}
resolve(commands); // this is in my code, I forgot to put it - sorry commenters
});
};
async function loadEvents () {
return new Promise(async (resolve, reject) => {
let events = 0;
readdir('./events/', (error, files) => {
if (error) reject (error);
for (const file of files) {
if (!file.endsWith('.js')) return;
events++
}
});
resolve(events);
});
};
然后,我在异步函数中使用await来尝试并确保在进入下一个函数之前每个函数都已解析:
console.log('started');
const events = await loadEvents();
console.log(events);
console.log('load commands');
const commands = await loadCommands();
console.log(commands);
console.log('end')
async function countJsFiles(path) {
const files = await readdirPromise(path);
let count = 0;
for (const file of files) {
if (file.endsWith('.js'))
count++;
// I don't think you really wanted to `return` otherwise
}
return count;
}
function loadCommands() {
return countJsFiles('./commands/');
}
function loadEvents() {
return countJsFiles('./events/');
}
在控制台中,这是链接的(请记住,我在/events/
中没有文件,在/commands/
中有一个文件):
我做错了什么?我希望这些函数按顺序运行。我试着用它来代替函数,它只是one-async函数中的裸代码,但还是遇到了这个问题。您尝试使用wait-outside-async。只能在异步函数中等待承诺。返回承诺的函数(此处为loadCommands
&loadEvents
)不需要异步。创建一个异步包装函数,如run
,并像这样调用其中的wait语句
PS:另外,您还需要使用回调本身中的命令解析loadCommands
。与加载事件相同。此外,删除返回值,并在为true时简单递增变量
function loadCommands() {
return new Promise((resolve, reject) => {
let commands = 0;
readdir('./commands/', (error, files) => {
if (error) reject(error);
for (const file of files) {
if (file.endsWith('.js')) commands++;
}
}
resolve(commands);
});
};
function loadEvents() {
return new Promise((resolve, reject) => {
let events = 0;
readdir('./events/', (error, files) => {
if (error) reject(error);
for (const file of files) {
if (file.endsWith('.js')) events++
}
resolve(events);
});
});
};
async function run() {
console.log('started');
const events = await loadEvents();
console.log(events);
console.log('load commands');
const commands = await loadCommands();
console.log(commands);
console.log('end')
}
run();
希望这有帮助 在readdir
回调发生之前,您从未resolve()
您在loadCommands
中创建的承诺,也从未resolve()
您在loadEvents
中创建的承诺
另外,不要在非承诺回调中执行任何逻辑。仅使用新承诺
构造函数,并在异步回调中仅调用解析
/拒绝
:
function readdirPromise(path) {
return new Promise((resolve, reject) => {
readdir(path, (err, files) => {
if (err) reject(err);
else resolve(files);
});
});
});
或
然后,您可以在实际逻辑函数中使用该承诺:
console.log('started');
const events = await loadEvents();
console.log(events);
console.log('load commands');
const commands = await loadCommands();
console.log(commands);
console.log('end')
async function countJsFiles(path) {
const files = await readdirPromise(path);
let count = 0;
for (const file of files) {
if (file.endsWith('.js'))
count++;
// I don't think you really wanted to `return` otherwise
}
return count;
}
function loadCommands() {
return countJsFiles('./commands/');
}
function loadEvents() {
return countJsFiles('./events/');
}
你从来没有在
loadCommands
@ADyson中做出承诺是的,你没有抓住要点。处理异步结果时使用承诺,顺序(then
)或并发(all
)readdir
未正确绑定到承诺。readdir()
需要以解析(命令)结束
@Bergi sorry正在进行快速阅读,错过了对readdir()的调用,因此有必要将返回
更改为继续
或中断
,这样才能工作。最好不要弄乱Promission代码中的程序逻辑。您好,这个答案与我的最终解决方案相混合,谢谢。我没有意识到return会打破循环,我从这段代码中学到了-谢谢。