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'of undefined ,
答案 0 :(得分:1)
首先,Q.fcall期望一个函数作为第一个参数,并将该函数的可选参数作为后续参数
所以,你需要像这样使用Q.fcall
Q.fcall(GetDTImage, 'Dogs')
.then(
function (imgBase64Code) {
console.log(imgBase64Code)
}, function (err) {console.log(err)}
)
但是,这将解析为通过调用
返回的值(或promise)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现在返回一个承诺,你也可以这样做:
GetDTImage('Dogs')
.then(
function (imgBase64Code) {
console.log(imgBase64Code)
}, function (err) {console.log(err)}
)
并完全忘记Q.fcall
答案 1 :(得分:0)
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 {
deferred.resolve(text.toString('base64'))
}
})
return deferred.promise
}
GetDTImage(Dogs)
.then(
function (imgBase64Code) {
console.log(imgBase64Code)
}, function (err) {console.log(err)}
)
感谢Jaromanda的支持。 我已经解决了,这是我的解决方案。