Я думаю, что у меня проблема с пониманием await / promises в Node.js, я думал, что реализую его правильно, но это выглядит неправильно ...

У меня есть эта функция, чтобы получить список файлов с моего Google Диска:

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() я могу видеть, что файлы печатаются правильно после {{ X3}} .... Я действительно не понимаю, после await filesList должен быть готов и решен.

Что я здесь делаю не так?

0
codeKiller 5 Дек 2020 в 19:17

2 ответа

Лучший ответ

Функция async возвращает обещание , так что вам все равно придется await это

Возвращаемое значение

Обещание, которое будет разрешено со значением, возвращаемым асинхронной функцией, или отклонено с исключением, сгенерированным или не перехваченным внутри асинхронной функции.

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();
2
hgb123 5 Дек 2020 в 16:19

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();
1
A McBride 5 Дек 2020 в 16:21