如何在节点快速路由器中沿承诺链向下“传输”变量
How to "transfer" variables down the promise chain in node express router?
我正在尝试在承诺链中进行两次单独的数据库调用,尽管出于测试目的,第一次调用被传递的简单字符串所取代。
我的问题是我无法访问第二个承诺中的变量 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);
});
});
另一个尝试,这里试图将路由器绑定到承诺......
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);
});
});
所以基本问题始终是,当我没有周围的对象,没有"this"将其附加到 =)
使用蓝鸟强大的Promise.coroutine()
:
router.route("/")
.get(Promise.coroutine(function*(request, response) {
try {
const dbResult1 = yield getValueFromDatabaseAsync(/* w/e */);
const dbResult2 = yield getValueFromDatabaseAsync(/* w/e, can be dbResult1 */);
const context = {...}; // use dbResult1 and dbResult2 here normally
response.render("start/index", context);
} catch (err) {
response.end(err);
}
}));
相关文章:
- 将函数的上下文应用于javascript变量
- 无法导出函数expressjs/requestjs中的变量
- 通过AJAX传输变量
- 如何用javascript将变量传输到外部js文件
- 如何在没有web服务器的情况下将变量数据从Python传输到Javascript
- 将javascript变量传输到插件函数(异步URL)
- 如何在节点快速路由器中沿承诺链向下“传输”变量
- 使用 Cookie 传输数值变量
- Web App - 将 Javascript 变量传输到 MySQL (JAVA)
- 将内联硬编码的 jQuery 函数传输到变量
- ASP.NET从Crystal Report获取变量,但未正确传输到外部应用程序
- 使用隐藏表单将javascript变量传输到php
- 通过链接传输变量,并在新页面中使用它们(JavaScript)
- 将javascript变量传输到Objective C (IOS)
- 如何将JavaScript变量传输到PHP
- 创建jQuery数组变量和传输数组到另一个页面PHP
- 如何使用jsp变量传输onclick并直接到其他页面
- Rails 3和jQuery-如何将ruby变量传输到javascript
- 将javascript变量从客户端传输到服务器
- 将javascript变量传输到同一页面上的php,而无需提交