Как мне извлечь объект (или массив) из объекта Promise, который был возвращен функцией Async / Await? - PullRequest
0 голосов
/ 09 июля 2020

Проблема

У меня проблемы с доступом к массиву данных, содержащемуся в объекте Promise {}, который был возвращен функцией Async / Await.

Я знаю, что Async / Await оболочка для обещаний, и поэтому она всегда будет возвращать обещание. Я просто не могу получить доступ к данным внутри.

Я тщательно исследовал это и даже не видел ссылки на то, что я вижу.

Код

Вот содержимое каталога изображений:

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'
  ]
}

Вопрос

Хотя может быть лучший способ go получить содержимое каталога, мой вопрос больше касается объекта Promise, возвращаемого функцией Async / Await.

Учитывая результат, как мне извлечь массив из этого Promise объекта?

Или, если это неправильный вопрос, как мне вернуть только массив?

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Правильный подход - создать асинхронную функцию, которая будет вашей «основной» функцией, поэтому вы просто вызываете ее, и она может содержать любые записанные вами асинхронные logi c. *

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()

Это вернет массив, полученный в результате обещания:

[
  'outside3.jpg',
  'outside2.png',
  'outside1.jpg',
  'matt.png',
  'truck.png'
]
0 голосов
/ 09 июля 2020

Это будет лучшим решением для вас.

const fs = require('fs');

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

const files = fs.readdirSync(imgPath);
console.log(files);
...