【发布时间】:2016-03-02 10:26:53
【问题描述】:
我试图在一个 Promise 链中进行两个单独的 DB 调用,尽管出于测试目的,第一个调用被一个传递的简单字符串替换。
我的问题是我无法在我的第二个承诺中访问变量 msg(我尝试设置 context.foo = msg。
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);
});
});
另一个尝试,这里尝试将路由器绑定到 promise...
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);
});
});
所以基本问题始终是,当我没有周围对象时,我如何“注入”或使用 Promise 范围内的变量,没有“this”将它附加到 =)
【问题讨论】:
-
第一个代码 sn-p 看起来不错,它应该可以工作。您可以尝试使用
console.log跟踪msg以了解发生了什么。您可以查看代码的简化 jsfiddle 版本:jsfiddle.net/pogLza0q -
您需要在
Snippet.find()回调中使用if(error) reject(error);。那时的错误可能是问题,也可能不是问题,但reject()无论如何都应该存在。 -
我会在这里使用bluebird coroutine。它会让你的生活更简单。
标签: javascript node.js express promise router