2014-11-03 49 views
0

我開發一個應用程序的NodeJS和遇到下面的問題:更新javascript函數內外部的變量的Node.js

我使用節點模塊node-rest-client發出使用REST API請求。我使用模塊提供的post方法來達到我的目的。我需要獲取json響應並將其寫入單獨的變量並返回它們。

我在client.post方法之外定義了returnData變量。我需要更新此函數中的returnData變量,該變量作爲參數傳遞給client.post方法。

但我在這裏有一個範圍問題。儘管我嘗試更新該函數內的returnData變量,但是當執行從client.post函數返回時,我看到在調用client.post函數之前,我設置的相同值(在此情況下爲null,但可能是任何值)仍然存在於該變量中。

如何定義範圍以便我可以更新函數內部的外部變量,並將其作爲參數傳遞給另一個函數?任何幫助將不勝感激。

以下是我的代碼:

module.exports = function(){ 
    require("../config"); 
    var restClient = require('node-rest-client').Client; 
    var client = new restClient(); 
    var sessionID = null, 
     reqID = 1; 

    var login = function(username, password){ 
     var requestParams = {}; 
     var apiParams = {}; 

     requestParams.jsonrpc = "2.0"; 
     requestParams.method = ZABBIX_API_METHODS.login; 
     apiParams.user = username; 
     apiParams.password = password; 
     requestParams.params = apiParams; 
     requestParams.id = reqID; 
     requestParams.auth = null; 

     var args = { 
      data: requestParams, 
      headers:{"Content-Type": "application/json-rpc"} // ask response type to be application/json-rpc 
     }; 

     var returnData = {}; 
     returnData.status = null; 
     returnData.data = null 

     client.post(ZABBIX_API, args, function(resData,rawRes){ 

      if(rawRes.statusCode == 200){ 
       returnData.status = rawRes.statusCode; 
       returnData.data = resData; 
      } 
      else{ 
       returnData.status = rawRes.statusCode; 
       returnData.data = "Request Failed!"; 
      } 

      reqID = reqID + 1; 
      console.log(returnData.data); 

     }); 

     console.log("SessionID:"+getSessionID()); 

     return returnData; 

    }  

    var functions = { 
     login: login 
    } 

    return functions; 
} 

謝謝。

+0

的可能重複[Node.js的:REST客戶端返回它的返回前值(http://stackoverflow.com/questions/20535689/node-js-rest-client-returns-the-value-before-its-返回) – manji 2014-11-03 09:34:31

回答

-1

.post是異步,你應該像這樣做,

var login = function(username, password, callback){ 
.................. 

client.post(ZABBIX_API, args, function(resData,rawRes){ 

     if(rawRes.statusCode == 200){ 
      returnData.status = rawRes.statusCode; 
      returnData.data = resData; 
     } 
     else{ 
      returnData.status = rawRes.statusCode; 
      returnData.data = "Request Failed!"; 
     } 

     reqID = reqID + 1; 
     return {login: returnData}; 
    }); 
//remove all below return statements 
+0

您仍然試圖從異步函數返回。使用回調。 – 2014-11-03 10:04:26

+0

@BenFortune我哪裏錯了?在這種情況下,IMO'If ... else Sync'。 :/ – Ravi 2014-11-03 10:06:35

+0

回調以return語句('return {login:returnData};')結束,但返回的數據在回調之外的任何地方都無法訪問。 – 2014-11-03 10:31:34

相關問題