Javascript 是否可以从node.js中的异步函数返回值?

Javascript 是否可以从node.js中的异步函数返回值?,javascript,node.js,asynchronous,promise,Javascript,Node.js,Asynchronous,Promise,我可能会在这里重新设计轮子,但我想创建一个函数,该函数采用文件名并异步返回base64编码的字符串 我真的只熟悉回拨,但也试图理解承诺。我的初始回调函数如下所示-- blob2Base64callback.js module.exports = { blob2base64 : function(file) { fs.readFile(file, 'utf8', function(err, contents){ if (err) { console.log(

我可能会在这里重新设计轮子,但我想创建一个函数,该函数采用文件名并异步返回base64编码的字符串

我真的只熟悉回拨,但也试图理解承诺。我的初始回调函数如下所示--

blob2Base64callback.js

module.exports = {
  blob2base64 : function(file) {
    fs.readFile(file, 'utf8', function(err, contents){
      if (err) {
        console.log('file not found');
        return '';
      } else {
        var base64str = Buffer.from(contents).toString('base64');
        console.log(base64str.length);
        return base64str;
      }
    });

  }, //..other functions
}; 
blob2base64 : function(file) {
  console.log('function called');
  const getFile = new Promise(function(resolve, reject){

    fs.readFile(file, 'utf8', function(err, contents){
      if (err) {
        console.log('file not found');
        reject(err)
      } else {
        //console.log(contents);
        resolve(contents);
      }
    });

  }).then(contents =>{
    var base64str = Buffer.from(contents).toString('base64');
    return base64str;
  }).catch(err => console.log(err));
}
此回调不起作用,因为我实际上没有从
blob2base4
函数返回某些内容,如果我将其修改为以下内容:

module.exports = {
  blob2base64 : function(file) {
    return fs.readFile(file, 'utf8', function(err, contents){
      //same implementation as above, cut to improve readability
    });

  }
};  
它返回undefined,因为它不等待执行。据我所知,不可能使用回调将某些内容返回到blob2base64

因此,我研究了承诺并尝试了以下方法:

module.exports = {
  blob2base64 : function(file) {
    return fs.readFile(file, 'utf8', function(err, contents){
      //same implementation as above, cut to improve readability
    });

  }
};  
blob2Base64promise.js

module.exports = {
  blob2base64 : function(file) {
    fs.readFile(file, 'utf8', function(err, contents){
      if (err) {
        console.log('file not found');
        return '';
      } else {
        var base64str = Buffer.from(contents).toString('base64');
        console.log(base64str.length);
        return base64str;
      }
    });

  }, //..other functions
}; 
blob2base64 : function(file) {
  console.log('function called');
  const getFile = new Promise(function(resolve, reject){

    fs.readFile(file, 'utf8', function(err, contents){
      if (err) {
        console.log('file not found');
        reject(err)
      } else {
        //console.log(contents);
        resolve(contents);
      }
    });

  }).then(contents =>{
    var base64str = Buffer.from(contents).toString('base64');
    return base64str;
  }).catch(err => console.log(err));
}
我是否可以将承诺返回给函数并提取解析部分以获取
base64str
?我的想法是对的,这种行为只有在承诺的情况下才可能发生,而不是回扣。或者这两种语法都不可能

另外,我认为回调和承诺不能一起使用,但这个承诺只是回调的包装

(按相反顺序回答)

通常情况下,回调和承诺并不混合,只是因为它们很混乱。如有必要,它们可以相互缠绕。有一些实用程序可以将回调转换为承诺(“promisify”),承诺变得越来越常见,特别是在ES6的
async/await
语法中

对于承诺,一定要回报承诺本身。在您的示例中,
返回getFile
。承诺链最终返回的内容您必须等待。这可能是ES6中的
async/await
关键字。你的电话可能是:

异步函数(){ 让result=wait blob2base64('myFile.png') }

这是一个更好的语法,可以让你知道你正在返回一个承诺。您也可以这样做:

function () {
  blob2base64('myFile.png')
  .then( result => {
    // use result here
  })
  // you could catch as well.
}
对于回调,还需要向函数传递回调。这就是它异步的原因,也是您给出结果的原因:

blob2base64 : function(file, callback) {
  fs.readFile(file, 'utf8', function(err, contents){
    if (err) {
      console.log('file not found');
      callback(err)
    } else {
      var base64str = Buffer.from(contents).toString('base64');
      console.log(base64str.length);
      callback(null, base64str)
    }
  });
您可以这样调用它:
blob2base64('myFile.png',function(err,result){

})

只需返回
getFile
@Pointy如何从返回的承诺中提取base64str?调用环境可以添加另一个
。然后()
回调返回的承诺值。如果这看起来很繁重,您可以开始查看
异步
等待
,这基本上是用一种不那么笨拙的语法来包装承诺回调代码的方法。谢谢,我将对此进行研究,对于以后看到这一点的其他人,我能够使用
parse.blob2base64('file.pdf')返回它。然后(val=>console.log(val))