簡體   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