阅读文件与ES6承诺

时间:2016-12-17 21:53:00

标签: javascript node.js ecmascript-6 es6-promise

let arr = [];

function getData(fileName, type) {
    return fs.readFile(fileName,'utf8', (err, data) => {
        if (err) throw err;

        return new Promise(function(resolve, reject) {
            for (let i = 0; i < data.length; i++) {
                arr.push(data[i]);
            }

            resolve();
        });
    });
}

getData('./file.txt', 'sample').then((data) => {
    console.log(data);
});

当我使用上面的代码并使用nodejs在命令行中运行时,我得到以下错误。

getData('./file.txt', 'sample').then((data) => {
                               ^

TypeError: Cannot read property 'then' of undefined

我该如何解决这个问题?

6 个答案:

答案 0 :(得分:22)

您希望将整个public void GetAllViews2() { foreach (var uControls in uControlList) { uControls newControl = uControls(); viewList.Add(newControl); } } 调用包装在新的fs.readFile中,然后根据回调结果拒绝或解决该承诺:

Promise

答案 1 :(得分:13)

没有人告诉我util.promisify所以我要发帖,不管这个问题多大了。 你为什么要收到这条消息?

getData('./file.txt', 'sample').then((data) => {
                               ^

TypeError: Cannot read property 'then' of undefined

getData是此处fs.readFile文件的包装器。 fs.readfile不是一个可行的(它没有实现then函数)。它建立在其他模式上,即回调模式。最着名的是Promises,这就是你想从readFile得到的东西。一点提醒:Mozilla - Promises

所以你可以做的就是像@hackerrdave一样自己实现它,或者我建议使用promisify:这个函数是Node.js的内置函数,它被实现来转换基于回调的函数成为承诺的基础。你会在这里找到它:Node.js Documentation for util.promisfy

它基本上与@hackerrdave相同,但它更强大,内置节点util。

以下是如何使用它:

const util = require('util');
const fs = require('fs');

const readFile = util.promisify(fs.readFile)
readFile("path/to/myfile").then(file => console.log(file))

答案 2 :(得分:8)

redis-server

答案 3 :(得分:8)

这是节点10.2.0的单行:

destructor

是的,它现在开箱即用。

答案 4 :(得分:6)

从节点12+开始,您可以使用fs.promises API

请参见以下示例:

const { readFile } = require('fs').promises

readFile('./file.txt', { encoding: 'utf8' })
  .then((data) => console.log(data))
  .catch((error) => console.error(error));

使用异步/等待

const { readFile } = require('fs').promises

async function readFile(filePath) {
  try {
    const data = await readFile(filePath, { encoding: 'utf8' })
    console.log(data)
  } catch (error) {
    console.error(error.message)
  }
}

readFile('./file.txt')

答案 5 :(得分:1)

更新当前节点,从节点10.0.0开始,您现在可以使用fs.promises

const fs = require('fs')

(async function(){
    var fileContents = await fs.promises.readFile(FILENAME)
    var data = JSON.parse(fileContents)
})()