Javascript 使用ES6承诺读取文件
如何解决此问题?您需要将整个Javascript 使用ES6承诺读取文件,javascript,node.js,ecmascript-6,es6-promise,Javascript,Node.js,Ecmascript 6,Es6 Promise,如何解决此问题?您需要将整个fs.readFile调用包装在一个新的承诺中,然后根据回调结果拒绝或解决承诺: getData('./file.txt', 'sample').then((data) => { ^ TypeError: Cannot read property 'then' of undefined const getData = (fileName, type) => new Promise((re
fs.readFile
调用包装在一个新的承诺
中,然后根据回调结果拒绝或解决承诺:
getData('./file.txt', 'sample').then((data) => {
^
TypeError: Cannot read property 'then' of undefined
const getData = (fileName, type) =>
new Promise((resolve, reject) =>
fs.readFile(fileName, type, (err, data) => {
//if has error reject, otherwise resolve
return err ? reject(err) : resolve(data);
})
);
getData('./file.txt', 'utf8')
.then(data => console.log('Data: ', data))
.catch(error => console.log('Error: ', error));
[更新]从Node.js v10开始,您可以选择使用fs.promises.
来使用fs.promises.
模块的内置Promise实现。在我们的readFile
示例中,我们将更新我们的解决方案以使用fs.promises
,如下所示:
function getData(fileName, type) {
return new Promise(function(resolve, reject){
fs.readFile(fileName, type, (err, data) => {
err ? reject(err) : resolve(data);
});
});
}
没有人告诉我关于
util.promisify
,所以不管这个问题有多老,我都要发帖了。
你为什么有这个消息
function getData(fileName, type) {
return fs.promises.readFile(fileName, {encoding: type});
}
getData
是这里的fs.readFile
文件的包装器fs.readfile
不是thenable(它不实现then
函数)。它构建在另一种模式上,即回调模式。最有名的表格是承诺,我相信这就是你想从readFile
中得到的。有一点提醒:
因此,您可以像@hackerrdave那样自己实现它,或者我建议使用promisify
:此函数是Node.js的内置函数,用于将基于回调的函数转换为基于承诺的函数。你可以在这里找到它:
它与@hackerrdave基本相同,但更健壮,内置node util
以下是如何使用它:
getData('./file.txt', 'sample').then((data) => {
^
TypeError: Cannot read property 'then' of undefined
以下是自节点10.2.0起的一条线性曲线:
(async()=>console.log(字符串(wait-require('fs').promises.readFile('./file.txt')))();
是的,它现在是现成的。从节点10.0.0开始更新当前节点您现在可以使用:
从节点12+开始,您可以使用 请参见下面的示例:
const{readFile}=require('fs')。承诺
readFile('./file.txt',{encoding:'utf8'})
.然后((数据)=>console.log(数据))
.catch((错误)=>console.error(错误));
使用异步/等待
const{readFile}=require('fs')。承诺
异步函数readFile(文件路径){
试一试{
const data=await readFile(文件路径,{编码:'utf8'})
console.log(数据)
}捕获(错误){
console.error(error.message)
}
}
readFile('./file.txt')
Swapreturn fs.readFile
withreturn new Promise()
。您返回的是没有返回值的fs.readFile
。您应该使用reject
而不是throw
,正如Marty已经指出的那样,您返回的是fs.readFile()
的结果,从当前版本的定义来看,这不是承诺。您可能会感到困惑,因为在then()
内部可以返回另一个承诺,然后将其链接起来。似乎内部return
可能会使OP更加困惑?我认为您需要返回新承诺
行,否则,getData将不会在其上定义,
。@counterbeing返回值对于没有大括号的箭头函数是隐式的。我将使用const promisify=require('util')。promisify然后直接使用promisify(fs.readFile)(“path/to/myfile”)。然后(…)
。请记住,正常回调的错误参数不会出现在then
函数中,但在catch
中,实际上,我会添加catch语句,它会更清晰。我还将编辑require语句,我没有考虑到这一点,但不需要整个util。多行会更好。这很难理解,V8编译器将为您进行优化。const readFilePromise=async file=>wait fs.promises.readFile(file)代码>此答案可能有效,但最早在11.0中对异步/等待部分进行了验证:)--也就是说,比此答案中引用的版本更早
getData('./file.txt', 'sample').then((data) => {
^
TypeError: Cannot read property 'then' of undefined
const util = require('util');
const fs = require('fs');
const readFile = util.promisify(fs.readFile)
readFile("path/to/myfile").then(file => console.log(file))
const fs = require('fs')
(async function(){
var fileContents = await fs.promises.readFile(FILENAME)
var data = JSON.parse(fileContents)
})()