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)一起去。它會讓你的生活變得更簡單。 –