Javascript 从readFile返回未定义的

Javascript 从readFile返回未定义的,javascript,node.js,Javascript,Node.js,我正在尝试让以下代码正常工作: 'use strict'; var fs = require('fs'); var fileName = 'readme.txt'; var str = fs.readFile(fileName, 'utf8', function (err, data) { if (err) { console.log(err); throw err; } return data; }); console.log('r

我正在尝试让以下代码正常工作:

'use strict';

var fs = require('fs');

var fileName = 'readme.txt';
var str = fs.readFile(fileName, 'utf8', function (err, data) {
    if (err) {
        console.log(err);
        throw err;
    }
    return data;
});

console.log('result read: ' + str);
自述文件:

console.log('working');
我试图显示以下内容:

result read: console.log('working');

readFile是一个异步方法(因此是回调函数)。异步函数的回调函数中需要console.log(或任何您想要对结果执行的操作)。这几乎是node.js的主干-通过允许将异步方法放在事件循环上,它可以防止代码被阻塞。

是异步执行的,因此
数据只能在回调函数内部访问,如果希望同步,应该使用

异步:

'use strict';

const fs = require('fs');

const fileName = 'readme.txt';
fs.readFile(fileName, 'utf8', function (err, data) {
   if (err)
      return console.log(err);
   console.log('result read: ' + data);
});
var str = fs.readFileSync(fileName, 'utf8'); // This will block the event loop, not recommended for non-cli programs.
console.log('result read: ' + str);
同步:

'use strict';

const fs = require('fs');

const fileName = 'readme.txt';
fs.readFile(fileName, 'utf8', function (err, data) {
   if (err)
      return console.log(err);
   console.log('result read: ' + data);
});
var str = fs.readFileSync(fileName, 'utf8'); // This will block the event loop, not recommended for non-cli programs.
console.log('result read: ' + str);
更新

您可以使用
util.promisify
fs.readFile
从回调API转换为promise API

const fs = require('fs');
const { promisify } = require('util');
const readFile = promisify(fs.readFile);

(async() =>  {
   try {
      const result = await readFile('readme.txt', 'utf8');
      consle.log(result);
   } catch(e) {
      console.error(e);
   }
})();
在节点10中,您可以使用
fs/promises
并避免
util.promisify

const fs = require('fs').promises;

(async() =>  {
   try {
      const result = await fs.readFile('readme.txt', 'utf8');
      consle.log(result);
   } catch(e) {
      console.error(e);
   }
})();

您正在调用一个异步函数。这意味着在调用时它不会等待返回,在本例中,它将返回未定义


您可以使用该方法同步调用它,也可以将您的
控制台.log
放在回调中

该“str”必须在函数之外。然后使用同步方法。我能够在最终产品中做出承诺:)当然,这是另一个解决方案;),请记住,节点文件系统函数在默认情况下是异步的,它们确实具有相应的同步功能;)我正在学习,我想我需要阅读异步函数是如何在框架中编写的,以充分理解这一点^^^我一直认为如果我烘焙一个同步函数来保证什么是异步函数,我猜我错了^^^啊谢谢。我将用co库把它包装成一个承诺。这是Javascript中异步操作最常见的问题之一。有关选项的讨论,请参见标记为重复的问题。不能直接从异步操作返回结果。在Javascript中,您必须使用回调。@jfriend00所以我自己不能将同步函数转换为异步函数(通过js),这是在较低级别上编程的吗?您不能将异步函数转换为同步函数,反之亦然。他们就是他们。对于
fs
模块,这是用
fs
库中的本机代码编程的。异步函数将是非阻塞的,并且结果将仅在稍后通过回调可用。同步函数将被阻塞,当它完成阻塞时,结果将直接可用。您可以通过回调发送返回结果,使同步函数看起来像是异步的,但它在执行操作时仍然会阻塞。@jfriend00如果您提到本机代码,您能更具体一点(我将检查它:)?这是and,这是上面的。