繁体   English   中英

nodeJS / Express:此RSVP承诺有什么问题?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM