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. } }