【问题标题】:How do I extract an Object (or Array) from a Promise-object that was returned by an Async/Await function?如何从 Async/Await 函数返回的 Promise 对象中提取对象(或数组)?
【发布时间】:2020-07-09 16:42:57
【问题描述】:

问题

我在访问由 Async/Await 函数返回的 Promise{} 对象中包含的数据数组时遇到问题。

我知道 Async/Await 是 Promises 的包装器,因此它总是会返回一个 Promise。我只是无法获取里面的数据。

我对此进行了广泛的研究,甚至没有看到关于我所看到的输出类型的参考。


代码

这是一个图像目录的内容:

outside3.jpg
outside2.png
outside1.jpg
matt.png
truck.png

假设我正在尝试获取目录中包含的项目列表。

const fs = require('fs');

/* The files are here */
const imgPath = "../public/images/client/carousel2/" 

const getFileList = async (filePath)=>{
    let fileList = [];
    const dir = await fs.promises.opendir(filePath);

    for await (const dirent of dir) {
        fileList.push(dirent.name)
    }

    return fileList
}

let fileNames = getFileList(imgPath)

setTimeout(()=>{
    console.log(fileNames)
}, 500);

输出

当我运行它时,我得到以下输出:

Promise {
  [
    'outside3.jpg',
    'outside2.png',
    'outside1.jpg',
    'matt.png',
    'truck.png'
  ]
}

问题

虽然可能有更好的方法来获取目录的内容,但我的问题更多地与 Async/Await 函数返回的 Promise 对象有关。

鉴于输出,我如何从 Promise 对象中提取数组?

或者,如果这是一个错误的问题,我该如何只返回一个数组?

【问题讨论】:

    标签: node.js ecmascript-6 async-await


    【解决方案1】:

    一种有效的方法是创建一个异步函数作为您的“主”函数,因此您只需调用它,它就可以包含您编写的任何异步逻辑。

    例子:

    const fs = require('fs');
    
    /* The files are here */
    const imgPath = "../public/images/client/carousel2/" 
    
    const getFileList = async (filePath)=>{
        let fileList = [];
        const dir = await fs.promises.opendir(filePath);
    
        for await (const dirent of dir) {
            fileList.push(dirent.name)
        }
    
        return fileList
    }
    
    const main = async () => {
      let fileNames = await getFileList(imgPath)
      console.log(fileNames)
    }
    
    main()
    

    这将返回由 promise 产生的数组:

    [
      'outside3.jpg',
      'outside2.png',
      'outside1.jpg',
      'matt.png',
      'truck.png'
    ]
    

    【讨论】:

    • 我一直在努力解决 javascript 中的异步问题。我什至回溯到回调,试图了解异步的演变,但它仍然没有点击。您的回答证实了我的怀疑,并帮助我填补了知识空白。谢谢 Telmo
    【解决方案2】:

    这将是您更好的解决方案。

    const fs = require('fs');
    
    /* The files are here */
    const imgPath = "../public/images/client/carousel2/" 
    
    const files = fs.readdirSync(imgPath);
    console.log(files);
    

    【讨论】:

    • 感谢您提供此解决方案,我已经将fs.readdirSync 函数视为我的程序的可能解决方案。但我的目的是尝试更好地理解 Async/Await。
    猜你喜欢
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 2017-10-21
    • 2016-08-31
    • 2020-11-19
    • 2018-03-27
    • 2016-04-10
    相关资源
    最近更新 更多