无法读取未定义 Q 的属性"apply".js



我试图用MongoDB捕获的数据异步填充数组。我有一组函数,应该一一执行一个从不同表中合并2个结果,但是执行后,错误会被击中:

TypeError: Cannot read property 'apply' of undefined

这是路由器的代码:

var Co2 = require("./../models/co2.model"),
  Dht = require("./../models/co2.model"),
  express = require("express"),
  q = require("q"),
  router = express.Router();
router.get("/all", function(req, res, next) {
  var co2Collector = function() {
    Co2.showAll(function(err, results) {
      co2Data = [];
      if (err) {
        res.json(err);
      }
      for (i = 0; i < results.length; i++) {
        co2Data.push(results[i]);
      }
      return co2Data;
    });
  };
  var dhtCollector = function() {
    Dht.showAll(function(err, results) {
      dhtData = [];
      if (err) {
        res.json(err);
      }
      for (i = 0; i < results.length; i++) {
        dhtData.push(results[i]);
      }
      return dhtData;
    });
  };
  var dataMerge = function(co2Data, dhtData) {
    mergedData = [];
    mergedData = mergedData.concat(co2Data, dhtData);
    res.json({
      message: "Done!",
      result: mergedData
    });
  };
  q
    .fcall(co2Collector())
    .then(dhtCollector())
    .then(dataMerge())
    .done();
});
module.exports = router;

逻辑似乎对我来说是正确的,但是,我对这种东西是新手,对我的理解有点模糊。感谢您的帮助!

p.s:问题可以在模式和静态方法中吗?作为回报,无论对代码进行了什么调整,结果是undefined,要么null

这是我的词汇模式:

var CO2Schema = mongoose.Schema(
    {
    location:{ type: String,required: true },
    reading: { type: String, required: true }
    },
    {
    timestamps: { createdAt : 'created_at', updatedAt : 'updated_at' },
    }
);
// Get CO2 results
CO2Schema.statics.showAll = function(cb) {
    return this.find({}, cb);
};

在这里您正在提前调用所有三个功能,并等待响应

q
  .fcall(co2Collector())
  .then(dhtCollector())
  .then(dataMerge())
  .done();

有效:

var a = co2Collector();
var b = dhtCollector();
var c = dataMerge();
q
  .fcall(a)
  .then(b)
  .then(c)
  .done();

您应该将函数本身作为参数传递或箭头函数。

q
  .fcall(co2Collector)

q
  .fcall(() => co2Collector())

等。

如果这是func返回承诺,则需要返回它。 co2CollectorCo2.showAll,以便q可以将值传递给下一个链接功能。需要调用.all([co2Collector(), dhtCollector()]),以使两个值都传递给dataMerge

q.fcall(dhtCollector)需要将功能转换为Promise

var Co2 = require("./../models/co2.model"),
  Dht = require("./../models/co2.model"),
  express = require("express"),
  q = require("q"),
  router = express.Router();
router.get("/all", function(req, res, next) {
  var co2Collector = function() {
    return Co2.showAll(function(err, results) {
      co2Data = [];
      if (err) {
        res.json(err);
      }
      for (i = 0; i < results.length; i++) {
        co2Data.push(results[i]);
      }
      return co2Data;
    });
  };
  var dhtCollector = function() {
    return Dht.showAll(function(err, results) {
      dhtData = [];
      if (err) {
        res.json(err);
      }
      for (i = 0; i < results.length; i++) {
        dhtData.push(results[i]);
      }
      return dhtData;
    });
  };
  var dataMerge = function(results) {
    co2Data = results[0].value;
    dhtData = results[1].value;
    mergedData = [];
    mergedData = mergedData.concat(co2Data, dhtData);
    res.json({
      message: "Done!",
      result: mergedData
    });
    return mergedData;
  };
  q
    .all([q.fcall(co2Collector), q.fcall(dhtCollector)])
    .then(dataMerge)
    .done();
});
module.exports = router;

相关内容

  • 没有找到相关文章

最新更新