var Q = require('q')
var fs = require('fs')
var deferred = Q.defer()
function GetDTImage (PicName) {
fs.readFile(process.cwd() + '\\' + PicName + '.jpg', function (error, text) {
if (error) {
console.log(error)
} else {
return text.toString('base64')
}
})
}
Q.fcall(GetDTImage('Dogs'))
.then(
function (imgBase64Code) {
console.log(imgBase64Code)
}, function (err) {console.log(err)}
)
大家好,这是一个困扰我一段时间的问题。
我很困惑,为什么上面的代码总是执行错误消息,无法读取未定义的属性“ apply”,
最佳答案
首先,Q.fcall将函数作为第一个参数,并将该函数的可选参数作为后续参数
因此,您需要像这样使用Q.fcall
Q.fcall(GetDTImage, 'Dogs')
.then(
function (imgBase64Code) {
console.log(imgBase64Code)
}, function (err) {console.log(err)}
)
但是,这将解析为通过调用返回的值(或承诺)
GetDTImage('Dogs')
但是您的函数GetDTImage不返回任何内容-唯一的return语句位于该函数的回调内部!
有效地,您的GetDTImage函数是
function GetDTImage (PicName) {
// go and do this asynchronous thing
fs.readFile(process.cwd() + '\\' + PicName + '.jpg', function (error, text) {
if (error) {
return reject(error);
}
resolve(text.toString('base64'));
});
// but return straight away regardless of that asynchronous thing
return undefined;
}
因为fs.readFile是异步的,所以您需要GetDTImage返回一个使它工作的承诺
function GetDTImage (PicName) {
// here we return a promise, huzzah!
return new Promise(function (resolve, reject) {
fs.readFile(process.cwd() + '\\' + PicName + '.jpg', function (error, text) {
if (error) {
return reject(error);
}
resolve(text.toString('base64'));
});
});
}
现在您可以
Q.fcall(GetDTImage, 'Dogs')
.then(
function (imgBase64Code) {
console.log(imgBase64Code)
}, function (err) {console.log(err)}
)
要么
Q.fcall(GetDTImage('Dogs'))
.then(
function (imgBase64Code) {
console.log(imgBase64Code)
}, function (err) {console.log(err)}
)
(我确定这两者之间存在差异,但是我对
Q
不够熟悉,无法准确定义该差异但是,由于GetDTImage现在返回一个Promise,您也可以这样做:
GetDTImage('Dogs')
.then(
function (imgBase64Code) {
console.log(imgBase64Code)
}, function (err) {console.log(err)}
)
完全忘记Q.fcall
关于javascript - Q.fcall总是失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42109300/