[英]Multi fetch wrong response with method POST - NodeJS + Express + Sequelize with Promise
[英]nodeJS / Express: what's wrong with this RSVP promise?
我正在使用nodeJS,運行express4框架來創建API。 我正在使用RSVP.js進行承諾。
worker.getFamilies由外部模塊調用,此處未反映。 調用者希望返回一個帶有結果的對象。
在worker.getFamilies內部:-我正在使用mongoose查詢mongoDB(可行,我們得到結果)
我使用諾言從貓鼬獲得響應對象(如果可用)。 這樣可行。
然后我嘗試返回JSON.stringify(results); 給worker.getFamilies的調用者,那是行不通的。 呼叫者返回“未定義”。 請幫忙。
var worker = exports; var RSVP = require('rsvp'); var getFamiliesFromDB = function(DBconnection){ var promise = new RSVP.Promise(function(resolve, reject){ DBconnection.find({} ,{limit:10, sort: [['_id',-1]]}).toArray(function(e, results){ console.log('results:', results); resolve(results); }); }); return promise; } worker.getFamilies = function(DBConnection){ getFamiliesFromDB(DBConnection).then(function(results){ //this works console.log('here are the fams from the promise', results); //this doesnt work like i want it to return JSON.stringify(results); }); };
好吧,對於初學者來說, worker.getFamilies
函數中沒有單個return
語句,這就是為什么它返回undefined
的原因(如果您未明確返回,這就是JavaScript自動返回的內容)。
您唯一的返回值在.then
處理程序內。 您需要退還諾言:
worker.getFamilies = function(DBConnection){
// note how we've added a `return` here!
return getFamiliesFromDB(DBConnection).then(function(results){
console.log('here are the fams from the promise', results);
return JSON.stringify(results);
});
};
現在我們的函數返回了,我們可以使用它的返回值:
// from caller site:
worker.getFamilies(dbconn).then(function(jsonResults){
console.log("Got results!", jsonResults);
});
正如喬納森·洛諾夫斯基(Jonathan Lonowski)解釋的那樣, “異步任務的結果無法真正return
” 。
有兩種解決方案。
如果您可以控制調用worker.getFamilies
的代碼。 您可以將代碼修改為:
worker.getFamilies = function(DBConnection){
return getFamiliesFromDB(DBConnection).then(function(results) {
return JSON.stringify(results);
});
};
使調用代碼執行此操作:
worker.getFamilies(DBConnection).then(function(results) {
console.log('now I can work with', results);
});
如果您無法控制調用代碼,它將變得稍微復雜一些:
var data;
worker.getFamilies = function() {
return data;
};
getFamiliesFromDB(DBConnection).then(function(results) {
data = JSON.stringify(results);
// Here, start up the code where `worker.getFamilies` is used.
});
基本上,您需要在調用所需代碼之前確保結果已准備就緒。
問題是您要從其他上下文返回。 重構getFamilies
如下:
worker.getFamilies = function(DBConnection, callback){
getFamiliesFromDB(DBConnection).then(function(results){
callback(JSON.stringify(results));
});
};
由於在調用棧中至少有一個異步函數(在您的情況下為getFamiliesFromDb
),您需要回調(或getFamiliesFromDb
)。
在您的版本中,您的return
語句解析為回調函數,而不是您想要的getFamilies
。
另一種方法是將getFamiliesFromDB
轉換為同步調用。 使用貓鼬API或等待Promise解析並返回其解析數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.