Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用jQuery,如何存储调用$.ajax函数的结果以供重用?_Javascript_Jquery_Ajax - Fatal编程技术网

Javascript 使用jQuery,如何存储调用$.ajax函数的结果以供重用?

Javascript 使用jQuery,如何存储调用$.ajax函数的结果以供重用?,javascript,jquery,ajax,Javascript,Jquery,Ajax,谢谢你阅读这篇文章 我想这确实是一个javascript问题,我的标题可能不是我要做的事情的核心,但我想将ajax请求的结果存储在一个全局变量中。这将允许我在进行ajax调用之前测试var……并避免对相同数据重复ajax调用。我需要能够通过populateSelect函数将click事件中的变量名向下传递到ajaxCall函数中 似乎我可以将函数作为参数传递,但我一直无法实现这一点 我喜欢在我的问题中包括工作示例,但在这种情况下,对服务器的调用延迟是问题的一部分 谢谢 $('#getSelect

谢谢你阅读这篇文章

我想这确实是一个javascript问题,我的标题可能不是我要做的事情的核心,但我想将ajax请求的结果存储在一个全局变量中。这将允许我在进行ajax调用之前测试var……并避免对相同数据重复ajax调用。我需要能够通过populateSelect函数将click事件中的变量名向下传递到ajaxCall函数中

似乎我可以将函数作为参数传递,但我一直无法实现这一点

我喜欢在我的问题中包括工作示例,但在这种情况下,对服务器的调用延迟是问题的一部分

谢谢

$('#getSelectOptions').bind("click", function() {
 populateSelect(this);
});

function populateSelect(whatWasClicked) {
 var thisSelect = $(whatWasClicked).parents("div").find("select") ;

 var before = function() { $(loading).show() ;  } ;
 var complete = function() { $(loading).hide() ;  } ;
 var data = {'_service' : 'myService', '_program' : 'myProgram' } ;
 var error = function(){alert("Error"); } ;
 var success = function(request) { $(thisSelect).html(request) ; };
 var waitTime = 20000 ;

 ajaxCall(thisSelect, waitTime, before, complete, data, success, error ) ;
}

function ajaxCall(elementToPopulate, waitTime, whatToDoBeforeAjaxSend,
                  whatToDoAfterAjaxSend, dataToSendToTheServer, 
                  whatToDoAfterSuccess, whatToDoAfterError) {
 $.ajax({   
  type: "post", 
  url: "http://myURL/cgi-bin/broker",   
  dataType: "text", 
  data: dataToSendToTheServer, 
  timeout: waitTime, 
  beforeSend: whatToDoBeforeAjaxSend, 
  error: whatToDoAfterError(request),
  success: whatToDoAfterSuccess(request)
 });
}

编辑如何写一个好问题的继续教育。。。我应该提到我调用populateSelect来填充多个select。所以我需要一种方法来引用每个select的结果,JavaScript的作用域是这样的,如果您刚刚声明了一个全局变量,那么您应该能够从ajax success函数和click函数中访问它

var _global_holder = null;
$('#getSelectOptions').bind("click", function() {
 if(_global_holder==null) { whatever }
 populateSelect(this);
});

function populateSelect(whatWasClicked) {
 if(_global_holder !== null) {
    whatever
  } else { whatever else }

 ajaxCall(thisSelect, waitTime, before, complete, data, success, error ) ;
}

function ajaxCall(elementToPopulate, waitTime, whatToDoBeforeAjaxSend,
                  whatToDoAfterAjaxSend, dataToSendToTheServer, 
                  whatToDoAfterSuccess, whatToDoAfterError) {
...
}

在您给出的示例中,您只有一种AJAX请求类型,
POST
ed每次使用相同的数据发送到相同的URL。如果是这种情况,您应该只需要以下内容:

var brokerResponse = null;  // <-- Global variable

function populateSelect(whatWasClicked) {
 var thisSelect = $(whatWasClicked).parents("div").find("select") ;

 if (!brokerResponse) {  // <-- Does an old response exist? If not, get one...
   var before = function() { $(loading).show() ;  } ;
   var complete = function() { $(loading).hide() ;  } ;
   var data = {'_service' : 'myService', '_program' : 'myProgram' } ;
   var error = function(){alert("Error"); } ;

   var success = function(request) {  // <-- Store the response before use
      brokerResponse = request; 
      $(thisSelect).html(brokerResponse);
   };
   var waitTime = 20000 ;

   ajaxCall(thisSelect, waitTime, before, complete, data, success, error ) ;
 }
 else {   // <-- If it already existed, we get here.
   $(thisSelect).html(brokerResponse);  // <-- Use the old response
 }
}

jQuery有一个$.data方法,可用于存储/检索与页面上任何元素相关的项

//e.g. create some object
var inst = {};
inst.name = 'My Name'

var target = $('#textbox1');

//save the data
$.data(target, 'PROP_NAME', inst);

//retrieve the instance
var inst =  $.data(target, 'PROP_NAME');

答案的第二部分,使用元素的ID引用全局数组中的数据,是一个很好的答案。我希望一个存储在变量中的函数可以在ajaxCall函数中传递和执行,但我猜js不是这样工作的。简单地检查select是否已经填充不是很容易吗?并且可以将函数作为变量传递。您只需将函数名(不带引号或())分配给一个变量,您可以通过简单地执行variable()来执行它。您是对的……这是避免重复进行ajax调用的一个好方法……但我确实想要一种存储(ajax调用)结果的方法,以便重复使用。我无法使用function-as-a-variable方法来存储ajax结果..当我在第二次调用中引用全局变量时,它是“未定义的”
//e.g. create some object
var inst = {};
inst.name = 'My Name'

var target = $('#textbox1');

//save the data
$.data(target, 'PROP_NAME', inst);

//retrieve the instance
var inst =  $.data(target, 'PROP_NAME');