2014-11-03 80 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

相关问题