Q.fcall总是失败

时间:2017-02-08 09:30:53

标签: javascript node.js

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

2 个答案:

答案 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的支持。 我已经解决了,这是我的解决方案。