0
我想在一个承诺链中做两个单独的数据库调用,但为了测试目的,第一个调用被一个传递的简单字符串替换。如何在节点快递路由器中将“变量”传递给承诺链?
我的问题是,我无法访问变量msg在我的第二个承诺(其中我尝试设置context.foo =味精。
router.route("/")
.get(function(request, response) {
var session = request.session;
return new Promise(function(resolve, reject) {
resolve("h!");
}).then(function(msg){
return new Promise(function(resolve, reject) {
Snippet.find({}, function(error, data) {
let context = {
snippets: data.map(function(snippet) {
return {
name: snippet.name,
snippet: snippet.snippet,
createdAt: snippet.createdAt,
user: snippet.user,
id: snippet._id
};
}),
foo: msg
};
resolve(context);
});
});
}).then(function(context){
response.render("start/index", context);
}).catch(function(err){
response.end(err);
});
});
的另一种尝试,在这里试图路由器绑定诺...
router.route("/")
.get(function(request, response) {
var session = request.session;
return new Promise(function(resolve, reject) {
resolve("hi!");
}).then(function(msg){
router.msg = msg;
return new Promise(function(resolve, reject) {
Snippet.find({}, function(error, data) {
let context = {
snippets: data.map(function(snippet) {
return {
name: snippet.name,
snippet: snippet.snippet,
createdAt: snippet.createdAt,
user: snippet.user,
id: snippet._id
};
}),
foo: this.msg
};
resolve(context);
}.bind(router));
});
第三尝试...
router.route("/")
.get(function(request, response) {
var session = request.session;
return new Promise(function(resolve, reject) {
context.msg = "hi!";
resolve(context);
}).then(function(context){
return new Promise(function(resolve, reject) {
Snippet.find({}, function(error, data) {
context.snippets = {
snippets: data.map(function(snippet) {
return {
name: snippet.name,
snippet: snippet.snippet,
createdAt: snippet.createdAt,
user: snippet.user,
id: snippet._id
};
}),
};
resolve(context);
});
});
}).then(function(context){
response.render("start/index", context);
}).catch(function(err){
response.end(err);
});
});
所以基本问题始终是,我怎么能“注入”,或使用无极范围内可变的,当我有没有周围的物体,没有“这个”来了attaach为=)
一码片段看起来不错,它应该工作。您可以尝试使用'console.log'来跟踪'msg'来了解发生了什么。你可以看看简化你的代码的jsfiddle版本:https://jsfiddle.net/pogLza0q/ –
你需要在Snippet.find()回调函数中使用'if(error)reject(error);'。此时的错误可能是也可能不是问题,但“reject()”应该在那里。 –
我会在这里和[bluebird coroutine](http://bluebirdjs.com/docs/api/promise.coroutine.html)一起去。它会让你的生活变得更简单。 –