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

时间:2018-06-28 13:32:09

标签: javascript node.js asynchronous promise

我可能在这里重新发明了轮子,但我想创建一个函数,该函数接受文件名并异步返回base64编码的字符串。

我真的只熟悉回调,但是也试图理解promise。我的初始回调函数如下所示:

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
}; 

此回调不起作用,因为我实际上没有从blob2base4函数返回任何东西,并且如果我将其修改为类似以下内容的话:

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

  }
};  

它返回undefined,因为它不等待执行。据我所知,没有办法使用回调将某些东西返回给blob2base64。

所以我研究了诺言并尝试了以下方法:

blob2Base64promise.js

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));
}

无论如何,我是否可以将promise返还给函数并提取resolve部分以获得base64str?我的想法正确吗,这种行为只能通过promise来实现,而不能通过回调实现。还是两种语法都不可能?

此外,我认为不能同时使用回调和Promise,但是此Promise只是回调的包装。

1 个答案:

答案 0 :(得分:1)

(以相反的顺序回答)

通常,回调和Promises不会混杂在一起,只是因为它们很杂乱。如有必要,它们可以交织在一起。有一些实用程序可以将回调转换为Promises(“ promisify”),并且Promises变得越来越普遍,尤其是ES6的async/await语法。

对于Promise,请确保返回Promise本身。在您的示例中,return getFile。 Promise链最终返回给您的内容必须await。这可能是ES6中的async/await关键字。您的电话可能是:

异步函数(){   让结果=等待blob2base64('myFile.png') }

这是一个更好的语法,用于了解您将返回Promise。您也可以这样:

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) { })