无法阅读财产'申请'未定义的Q.js

时间:2018-02-18 18:40:40

标签: javascript arrays node.js asynchronous q

我正在尝试使用从MongoDB捕获的数据异步填充Array。我有一组函数,它们应该逐个执行以将来自不同表的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:问题可以在Schema和静态方法中吗?作为回报,无论对代码进行了哪些调整,结果都是undefinednull

这是我的猫鼬模式:

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);
};

2 个答案:

答案 0 :(得分:0)

在这里,您预先调用所有三个功能,并等待响应

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())

答案 1 :(得分:0)

如果这是一个返回承诺的函数,那么你需要返回它。 来自Co2.showAll的{​​{1}},以便co2Collector可以将值传递给下一个链接函数。 需要致电q,以便将这两个值传递给.all([co2Collector(), dhtCollector()])

将函数转换为promise

需要

dataMerge

q.fcall(dhtCollector)