![](/img/trans.png)
[英]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.