2016-04-24 64 views
0

我完全絕望的這個問題。我有一個查詢數組,我在內存中存儲這麼久。有了它,我調用了一個API,激發我的請求並將結果存儲到MongoDB中......沒問題。不幸的是,我沒有控制權。 API服務器和一些Econnet/TCP/IP連接錯誤使我的應用程序不時崩潰。與貓鼬和節點查詢的時間

爲了能夠恢復我的查詢任務,我將所有查詢寫入了我的MonogDB,並且我想跟蹤/記錄正在執行或未執行的每個查詢的queryState。

當我嘗試從Mongo返回查詢請求的方法時,發生了我的問題。由於一些定時/異步問題(我猜),我queryArray撐未定義所有的時間,我不把它解決...

server.js:

//TEST 
var querymongo = require('./config/queryMongo'); 
var queryobject = new querymongo; 
var queryArray = queryobject.results(); 

queryArray撐未定義所有時間...

queryMongo.js:

//require mongo model + db connection 
    var queryDB = require('./queryDB'); 

    //constructor 
    ... 

    //mongoRequest method 
     this.mongoRequest = function(){ 
      console.log("Function mongoRequest called now!"); 
      return new Promise(function(resolve, reject){ 
       queryDB.queries.find({'SearchIndex': 'All'}, function(err, doc){ 
        if(err) return reject (err) 
        else resolve (doc) 
       }); 
      }); 
     } 

    //resolve results 
    this.results = function(){ 
     var queryArray = []; 
     this.mongoRequest().then(function(doc, err){ 
      console.log(doc) 
      queryArray = doc; 
      return queryArray; 
     }).catch(function(err){ 
      console.log(err) 
      }); 
     } 



} 
module.exports = QueryMongo; 

的執行console.log(DOC)結果方法可行,但在返回所有文檔所有正在執行的代碼的結尾。這裏有什麼問題?

我會非常感謝,因爲這讓我瘋狂!

感謝

哲羅

+0

我想你應該在你的'results'函數中返回一個承諾或回調。因爲你的'QueryMongo'是異步的,你不應該把它用作同步功能 –

+0

這就是問題所在。我一步一步調試代碼,問題在於我的結果函數resp中的「then」。回調。它再次運行異步...另一個承諾? – Hucho

回答

0

所以你的問題是,爲什麼queryArray是不確定的?

因爲Mongo查詢是異步的,而且你在執行console.log之後,也就是在獲得結果之前。

//resolve results 
this.results = function(){ 
    var queryArray = []; 
    this.mongoRequest().then(function(doc, err){ 
    //////// DO SOMETHING WITH THE RESULT HERE 
    }).catch(function(err){ 
     console.log(err) 
     }); 
    } 
+0

感謝您的回答,但我正在做這個... – Hucho

+0

我自己解決了它,它的工作很好...如果有人有興趣我可以發佈代碼... – Hucho