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/

10-09 18:58