Node.js 无法从承诺中返回内容

Node.js 无法从承诺中返回内容,node.js,es6-promise,Node.js,Es6 Promise,不了解下面的代码是如何执行的 // readFile.js const fs = require('fs'); var readFile = function readFile(fileName){ return new Promise((resolve, reject)=>{ fs.readFile(fileName, {encoding: 'utf-8'}, (err, contents)=>{ if(err){ reject(err);

不了解下面的代码是如何执行的

// readFile.js

const fs = require('fs');
var readFile = function readFile(fileName){
  return new Promise((resolve, reject)=>{
    fs.readFile(fileName, {encoding: 'utf-8'}, (err, contents)=>{
      if(err){
        reject(err);
      }
      resolve(contents);
    });
  });
};
module.exports.readFile = readFile;

//play.js
const {readFile} = require('./readFile');

var getText = function getTextFromFile(){

  readFile('readMe.txt').then((contents)=>{
     return contents;
  }).catch((err)=>{
    console.log(err);
  });
};
module.exports.getText = getText;

//someFile.js
const {getText} = require('./play.js');

var result = getText();
console.log(result);

当我执行someFile.js时,它会打印未定义的文件。它应该打印内容,因为play.js文件中的then块只有在异步任务(即从文件读取内容)结束时才会执行。使用上面的代码,如何将内容返回到其他文件,例如从play.js返回到someFile.js?

承诺是异步的,您应该为此函数提供回调,如下所示:

function getTextFromFile(cb){

  readFile('readMe.txt').then((contents)=>{
     cb(null, contents);
  }).catch((err)=>{
    console.log(err);
    cb(err);
  });
};
您可以通过以下方式获取文件:

const { getText } = require('./play.js');

getText((err, data) => {
   if(err) throw new Error('file doesnt exist');
   console.log(data);
});
你也可以在这里使用承诺,但底线是:

如果代码中的某些内容是异步的,则不能使用
return

或者更好的办法是,将中间人从这里移走,因为不需要中间人:

const {readFile} = require('./readFile.js');

readFile('example.json')
  .then((data) => console.log(data))
  .catch((err) => console.log(err));

当然,您可以使用,但它是一个

,您正在尝试从承诺同步返回一个值。这是不可能的。只需从
getText
返回承诺,然后在
someFile.js
中使用
.then()
。是的,修复了@cubrr谢谢