我的功能可以';t通过它';s参数值javascript

我的功能可以';t通过它';s参数值javascript,javascript,jquery,Javascript,Jquery,我一直在努力从函数传递参数,但我真的不知道哪里出了问题。我有一个函数,它有一个参数,我想传递给postData以在jQgrid中显示数据。以下是我的函数代码和参数: function getTID(hdrID){ var selected = $('#editTallyHdr').val(); var hdrID = ''; var hdrNo = ''; var nameFlag=0; var par_ams = { "SessionID": $.cookie

我一直在努力从函数传递参数,但我真的不知道哪里出了问题。我有一个函数,它有一个参数,我想传递给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)下面的代码无法检索参数,它显示为空。这对任何人来说都很简单,但我真的需要帮助。。这方面的工作已经进行了相当长的时间。

问题在于您正在执行一个ajax请求(异步请求)。然后,函数不等待答案到达,而是继续并返回hdrID(当时未设置)。在这之后,将进入一个响应,并调用success方法,该方法将hdrID设置为appropiate值

解决此问题的常用方法是在执行success方法时,使用所需的值执行特定函数。代码太多,无法查看,但可能会出现以下情况:

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

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


要处理异步函数调用(如ajax调用),必须将编程风格更改为异步工作的方式。在本例中,对ajax调用的响应只在ajax all的成功处理程序中知道。因此,您必须重新构造代码,以继续执行处理和处理来自成功处理程序的ajax响应。如果您只有一点点工作要做,那么您可以将其全部放入成功处理程序中。如果您有很多工作要做,那么您可以将所有剩余的工作放在一个函数调用中,并从成功处理程序调用它。

您可以做的是定义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'); 
    };
});

您不能从该函数返回值,因为它正在发出异步ajax请求。您的意思是我不能从该函数返回ID getId(hdrID)?为什么会这样?你知道如何获取ID吗?
如果你有很多工作要做,那么你可以将所有剩余的工作放在一个函数调用中,并从成功句柄调用它。那么,这是否意味着我仍然可以使用我的函数
getTID(hdrTID)
,但我只需要在成功处理程序中调用它?对不起,如果我真的不能理解。我从来都不知道这个。谢谢你的回答,但我真的不知道如何使用你给我的代码。您的第一段是正确的,因为我在提醒ID时注意到了这一点。我尝试使用它,
函数fetchContent(continueFunction){$.ajax(params).success(函数(reply){//从reply getID(hdrID);)检索所需的参数}
,但是它给了我一个错误
params不是一个函数
。我应该如何将其用于我的代码?