繁体   English   中英

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

[英]my function can't pass it's parameter value javascript

我一直在努力从函数中传递我的参数,但我真的不知道我在哪里 go 错了。 我有一个 function 有一个参数,我想传递给我的 postData 以在我的 jQgrid 中显示数据。 这是我的带有参数的 function 代码:

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 代码,我称之为 function 以获取它的参数:

$("#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');      

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

问题是您正在执行 ajax-request(异步请求)。 然后 function 不会等待答案到达,而是继续并返回 hdrID(当时未设置)。 之后响应进来,并调用成功方法,它将 hdrID 设置为适当的值。

解决此问题的常用方法是在执行成功方法时执行具有所需值的特定 function。 需要查看的代码太多,但它可以 go 是这样的:

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

这是一个很常见的误解。 仅在过去两周内,我就可能回答了其中的 15 个问题。 ajax 调用是异步调用。 这意味着当您进行 ajax 调用时,它只是启动请求。 然后,当该请求进入后台时,您的代码会立即继续执行。 这意味着您的 function getTID()在 ajax 调用甚至完成之前返回,它的值尚不清楚。 因此,当您从getTID()返回时,无法从 ajax function 返回响应值,因为它根本不知道。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM