我试图用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返回承诺,则需要返回它。 co2Collector
的Co2.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;