Javascript 是否可以从node.js中的异步函数返回值?
我可能会在这里重新设计轮子,但我想创建一个函数,该函数采用文件名并异步返回base64编码的字符串 我真的只熟悉回拨,但也试图理解承诺。我的初始回调函数如下所示-- blob2Base64callback.jsJavascript 是否可以从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(
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))代码>