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会打破循环,我从这段代码中学到了-谢谢。