asynchronous函数返回Promise {<pending>}?

我有以下的asynchronous函数:

async function readFile () { let content = await new Promise((resolve, reject) => { fs.readFile('./file.txt', function (err, content) { if (err) { return reject(err) } resolve(content) }) }) console.log(content) } readFile() 

这运行得很好。 它按预期的方式将文件缓冲区输出到控制台。 但是现在,如果我尝试返回值:

 async function readFile () { let content = await new Promise((resolve, reject) => { fs.readFile('./file.txt', function (err, content) { if (err) { return reject(err) } resolve(content) }) }) return content } console.log(readFile()) 

我现在得到:

 Promise { <pending> } 

为什么是这样? 为什么你可以在该函数中使用一个值,但是当你将它从函数中返回时,它现在是一个Promise?

您如何在正常的工作stream程中使用这个function? 例如,假设我想检查文件是否存在,然后读取文件,然后用内容更新某个数据库,那么同步伪代码将如下所示:

 if (fileExists(path)) { buffer = readFile(path) updateDatabase(buffer) } 

该工作stream程由3个独立的asynchronous操作组成。 你如何做这样的async/await ? 你需要把整个脚本包装在一个async函数中吗?

 async function doSomething () { if (fileExists(path)) { buffer = readFile(path) updateDatabase(buffer) } } 

(请记住,这只是伪代码,但希望它能让我知道)。

所有的async函数都会返回一个如评论中提到的承诺。 因此,你可以像这样重新编写你的readFile函数:

 function readFile() { return new Promise((resolve, reject) => { fs.readFile('./file.txt', function (err, content) { if (err) { return reject(err) } resolve(content) }) }) } 

然后,您将通过await消耗readFile的返回值:

 console.log(await readFile()) // will log your actual file contents. 

这种范例的通常工作stream程是将asynchronous操作分解为单独的函数,每个函数都返回一个promise,然后在更广泛的async函数中运行它们,就像您所build议的一样,但是会await和处理一些错误:

 async function doSomething () { try { const fileCheck = await fileExists(path) if (fileCheck) { const buffer = await readFile(path) await updateDatabase(buffer) // Whatever else you want to do } } catch (err) { // handle any rejected Promises here. } }