在Express路线中使用Monoskin我正在做以下事情:
router.get(/getbuyerinfo, function(req, res) {
var data = "data";
db.collection('buyerRec').find().toArray(function(err, result) {
if (err) throw err;
console.log(result);
db.collection('buyerHistory').find().toArray(function(err, result) {
if (err) throw err;
console.log(result);
console.log(data);
});
});
});
实际上更深刻了。但是为了尽可能地以最直接和最快捷的方式清理深度回调,即使不是最现代化的方式,我创建了:
router.get(/getbuyerinfo, getBuyerRec);
function getBuyerRec(req, res) {
var data = "data";
db.collection('buyerRec').find().toArray(getBuyerHistory);
}
function getBuyerHistory(err, result) {
if (err) throw err;
console.log(result);
db.collection('buyerHistory').find().toArray(function(err, result) {
if (err) throw err;
console.log(result);
console.log(data);
});
}
我的问题是“数据”已不在范围内。 'data'值来自Express router.get()。如何将'data'传递给getBuyerHistory函数以便我可以使用它?
答案 0 :(得分:1)
假设你有以下几点:
(function () {
var data = "data";
db.collection('buyerRec').find().toArray(getBuyerHistory);
}());
function getBuyerHistory(err, result) {
if (err) throw err;
console.log(result);
db.collection('buyerHistory').find().toArray(function(err, result) {
if (err) throw err;
console.log(result);
console.log(data);
});
});
您可以创建一个返回函数的函数,并将data
作为参数传递:
function factory(data) {
return function getBuyerHistory(err, result) {
...
};
}
然后您可以调用它来创建传递给toArray
的函数:
(function () {
var data = "data";
db.collection('buyerRec').find().toArray(factory(data));
}());
或者,如果您未在this
中使用getBuyerHistory
,则可以将data
绑定为上下文并将绑定函数传递给toArray
:
(function () {
var data = "data";
db.collection('buyerRec').find().toArray(getBuyerHistory.bind(data));
}());
或者,正如@Bergi正确指出的那样,您可以向getBuyerHistory
添加另一个参数,并在没有上下文的情况下使用bind
:
(function () {
var data = "data";
db.collection('buyerRec').find().toArray(getBuyerHistory.bind(null, data));
}());
function getBuyerHistory(data, err, result) {
...
}