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

Swap
return fs.readFile
with
return new Promise()
。您返回的是没有返回值的
fs.readFile
。您应该使用
reject
而不是
throw
,正如Marty已经指出的那样,您返回的是
fs.readFile()
的结果,从当前版本的定义来看,这不是承诺。您可能会感到困惑,因为在
then()
内部可以返回另一个承诺,然后将其链接起来。似乎内部
return
可能会使OP更加困惑?我认为您需要
返回
新承诺
行,否则,getData将不会在其上定义
。@counterbeing
返回值对于没有大括号的箭头函数是隐式的。我将使用
const promisify=require('util')。promisify
。请记住,正常回调的错误参数不会出现在
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)
})()