我可能在这里重新发明了轮子,但我想创建一个函数,该函数接受文件名并异步返回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只是回调的包装。
答案 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) {
})