【问题标题】:Node.js function async return not awaitingNode.js 函数异步返回不等待
【发布时间】:2020-12-06 00:21:52
【问题描述】:

我认为我在理解 Node.js 中的 await/promises 时遇到了问题,我认为我正确地实现了它,但它看起来不正确...

我有这个功能可以从我的 Google Drive 中获取文件列表:

const listFiles = async () => {
    const filesList = await googleDrive.listFiles();
    filesList.forEach((file)=>{
        console.log(`File is ${file.name}`);
    });
    return filesList;
  }

这个函数工作正常,但现在我尝试在我的 main.js 中这样调用它:

const listFiles = async () => {
    const filesList = await googleDrive.listFiles();
    filesList.forEach((file)=>{
        console.log(`File is ${file.name} with id`);
    });
    return filesList;
  }

const getFiles =() =>{
    const files = listFiles();
    console.log(files);
};


getFiles();

所以我的问题是,从getFiles()我总是得到Promise { <pending> } 作为console.log...但是在我的listFiles() 中,我可以看到在await 之后正确打印的文件.. ..我不太明白,在await 之后,filesList 应该准备好并解决了。

我在这里做错了什么?

【问题讨论】:

    标签: node.js promise async-await


    【解决方案1】:

    async函数returns a promise,所以你还是要await

    返回值

    将使用异步函数返回的值解析的 Promise,或因异步函数抛出或未捕获的异常而被拒绝。

    const listFiles = async () => {
        const filesList = await googleDrive.listFiles();
        filesList.forEach((file)=>{
            console.log(`File is ${file.name} with id`);
        });
        return filesList;
      }
    
    const getFiles = async () =>{
        const files = await listFiles();
        console.log(files);
    };
    
    
    getFiles();
    

    【讨论】:

    • 好的,谢谢,现在我猜 getFiles 也会返回一个承诺,当我再次调用它时,我将不得不等待,一遍又一遍,对吗?
    • @codeKiller 是的,如果这种情况下不需要在getFiles() 之后顺序执行任务,你仍然可以这样调用它
    • 在调用 getFiles() 时使用 .then & .catch 。这就是我所遵循的,所有异步等待代码,但最后一个 .then & .catch 。如果您没有发现错误,那么当您在 getFiles 函数中出现任何错误时,您将收到“未处理的承诺拒绝”错误。
    【解决方案2】:

    listFiles 被正确列为 async,但在这种情况下,getFiles 也应该是异步的 - 它需要 await listFiles 的结果。

    您的代码应如下所示:

    const listFiles = async () => {
        const filesList = await googleDrive.listFiles();
        filesList.forEach((file)=>{
            console.log(`File is ${file.name} with id`);
        });
        return filesList;
      }
    
    const getFiles = async () =>{
        const files = await listFiles();
        console.log(files);
    };
    
    
    getFiles();
    

    【讨论】:

      猜你喜欢
      • 2013-07-24
      • 1970-01-01
      • 2011-03-04
      • 2020-12-23
      • 2020-08-01
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多