我的函数无法传递它的参数值javascript

时间:2011-07-18 18:59:23

标签: javascript jquery

我一直在努力从函数中传递我的参数,但我真的无法弄清楚我哪里出错了。我有一个函数有一个参数,我想传递给我的postData以显示我的jQgrid中的数据。这是带有参数的函数代码:

function getTID(hdrID){
  var selected = $('#editTallyHdr').val();  
  var hdrID = '';
  var hdrNo = '';

  var nameFlag=0;
  var par_ams = {
    "SessionID": $.cookie("SessionID"),
    "dataType": "data"
  };
  $.ajax({
    type: 'GET',
    url: 'processjson.php?' + $.param({path:'getData/tallyHdr',json:JSON.stringify(par_ams)}),
    dataType: primeSettings.ajaxDataType,
    success: function(data) {
      if ('error' in data)
      {
        showMessage('ERROR: ' + data["error"]["msg"]);
      }
      else{            
        $.each(data['result']['main']['rowdata'], function(rowIndex, rowDataValue) {
          $.each(rowDataValue, function(columnIndex, rowArrayValue) {
            var fldName = data['result']['main']['metadata']['fields'][columnIndex].name;
            if (fldName == 'transaction_id'){
              hdrID = rowArrayValue; 
            }
            if (fldName == 'transaction_num'){   
              hdrNo = rowArrayValue; 
              if(selected == hdrNo){
                nameFlag =1;
              };        
            }
          });   
        }); 
      }
    }
  }); 
  return (hdrID);
} 

这是我的jQgrid代码,我调用该函数来获取它的参数:

$("#tblPlank").jqGrid({
        url: '',                            
        datatype: 'local',
        jsonReader : {
          .
          .
          .
serializeGridData: function(postData) {

      var ctr =0;
      var filt=[];
      var c=[];      

      var jsonParams = {
      'SessionID':  $.cookie("SessionID"),
      'dataType': 'data',
      'transaction_id':getTID(hdrID),
      'filters': c,
      'lines':plank_data,      
      'recordLimit': postData.rows,
      'recordOffset': postData.rows * (postData.page - 1),
      'rowDataAsObjects': false,
      'queryRowCount': true,
      'sort_fields': postData.sidx
      };  
.
.// some code here
.
. 
      return 'json=' + JSON.stringify(jsonParams);
    },
    loadError: function(xhr, msg, e) { 
      showMessage('HTTP error: ' + JSON.stringify(msg) + '.');
    },
    colNames:[...], 
    colModel:[      
     ........................
    ],  
    .
    .
    .
    caption: "Tally Transaction Details/Lines"

我还有另一个代码,我想获得该参数。这是最后一段代码:

var par_ams = {
    "SessionID": $.cookie("SessionID"),
    "dataType": "data",
    "transaction_id": getTID(hdrTID) 
}                                              
$('#tblPlank').setGridParam({
    url:'processjson.php?path=' + encodeURI('getData/tallyLnDtl') + '&json=' + encodeURI(JSON.stringify(par_ams)), 
    datatype: primeSettings.ajaxDataType,  
});
$('#tblPlank').trigger('reloadGrid');      

那些函数getTID(hdrID)下面的代码无法检索参数,它显示为空。对任何人来说这可能都很简单,但我真的需要帮助...已经使用了很长时间。

3 个答案:

答案 0 :(得分:1)

问题是您正在执行ajax请求(异步请求)。然后该函数不等待答案到达,但只是继续并返回hdrID(当时未设置)。在此之后,响应进入,并调用success-method,将hdrID设置为适当的值。

解决此问题的常用方法是在执行成功方法时执行具有所需值的特定函数。要研究的代码太多了,但它可能是这样的:

function fetchContent(continueFunction) {
      $.ajax(params).success(function(reply) {
           // retrieve desired params from reply
           continueFunction(retrievedParameters);
      }
}

答案 1 :(得分:1)

这是一个非常普遍的误解。仅在过去的两周里,我可能已经回答了其中的15个问题。 ajax调用是异步调用。这意味着当你进行ajax调用时,它只是启动请求。然后,当该请求进入后台时,您的代码会立即继续执行。这意味着你的函数getTID()在ajax调用完成之前返回,并且它的值尚未知晓。因此,当您从getTID()返回时,无法从ajax函数返回响应值,因为它尚不为人所知。

要使用异步函数调用(如ajax调用),必须将编程风格更改为异步工作。在这种情况下,对ajax调用的响应仅在ajax all的成功处理程序中已知。因此,您必须重新构建代码以继续执行处理以及处理成功处理程序的ajax响应。如果您只需要做一些工作,那么您可以将它全部放在成功处理程序中。如果你有很多工作要做,那么你可以把所有其余的工作放在一个函数调用中,并从成功处理程序中调用它。

答案 2 :(得分:0)

你可以做的是定义getTID,一旦它具有id,就接受一个回调来执行,例如

function getTID(hdrID, callback) {
    //ajax stuff....
    success: function (data) {
        // Error checks, etc 
        hdrID = //something dependent on data
        callback(hdrID); // THIS IS THE IMPORTANT PART

}

回调将在请求返回后执行,此时可以安全地使用从回调中需要的ajax请求返回的数据。您可以在回调中包装需要请求返回值的所有代码,例如

getTID(hdrID, function (ID) {
    var params = {
        "SessionID": $.cookie("SessionID"),
        "dataType": "data",
        "transaction_id": ID //USE ID 
    }                                              
    $('#tblPlank').setGridParam({
        url:'processjson.php?path=' + encodeURI('getData/tallyLnDtl') + '&json=' +     encodeURI(JSON.stringify(par_ams)), 
        datatype: primeSettings.ajaxDataType,   
    });
    $('#tblPlank').trigger('reloadGrid'); 
    };
});