Я, вероятно, заново изобретаю колесо, но я хочу создать функцию, которая принимает имя файла и асинхронно возвращает закодированную строку 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
};
Этот обратный вызов не работает, потому что я на самом деле не возвращаю что-то из функции blob2base4
, и если я изменяю это следующим образом:
module.exports = {
blob2base64 : function(file) {
return fs.readFile(file, 'utf8', function(err, contents){
//same implementation as above, cut to improve readability
});
}
};
Возвращает неопределенное значение, потому что не ожидает выполнения. Насколько я знаю, нет никакого способа вернуть что-либо в 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));
}
Можно ли в любом случае вернуть обещание функции и извлечь часть разрешения для получения base64str
? Правильно ли я думаю, такое поведение возможно только с обещаниями, но без обратных вызовов. Или это невозможно с любым синтаксисом?
Кроме того, я думал, что обратные вызовы и обещания нельзя использовать вместе, но это обещание является просто оболочкой для обратного вызова.