javascript - 进行异步 AJAX 调用后运行函数,传递变量

标签 javascript jquery

我正在处理的一些代码遇到问题。我有一个通用函数(ajaxContent),可以从多个 Angular 使用。我需要的是在进行 AJAX 调用后运行一个函数,但我需要传递在进行调用之前拥有的一些数据(因此不是从 AJAX 调用返回的数据。

function ajaxContent(url, id, target, data, callbackFunction) {

  $.ajax({
    async : true,
    ....    
    complete: function(){
      if(typeof callbackFunction == "function"){
        callbackFunction(); // function get's executed here, lead_id is not available
      }
    }
  });
}    

$(document).on("click", "#something", function(){
  var leaf_id = $(this).attr('rel');

  ajaxContent(url, id, target, data, function(leaf_id){

    url = "/path/" + leaf_id;
    window.location = url;

  })
})

$(document).on("click", "#action", function() {

    ajaxContent(url, id, target, data, function(){

        if ($(this).attr('rel') == "M_0") // $(this).attr('rel') not available here, so need to pass through some way
            $('#treedata').css('background', 'url(/img/rotonde.png) 50% 50% no-repeat');
  });

});    

我也许可以使用类似的东西

function ajaxContent(url, id, target, data, callbackFunction, varA, varB, varC, varD) { 
   callbackFunction(varA, varB, varC, varD);
} 

ajaxContent(url, id, target, data, function(varA){
}, varA, varB, varC, varD)` 

但并不是真正可扩展的。

我希望这是清楚的:-)

最佳答案

在您现在的答案中的代码中,leaf_iddocument.ready() 处理函数内的局部变量。因此,它在该上下文之外不可用。

您有多种选择来解决这个问题:

  1. 您可以将 ajaxContent 函数的定义移动到 document.ready() 处理函数中,以便它能够看到 leaf_id。

  2. 您可以将 leaf_id 设为全局变量,以便可以从任何地方访问它。

  3. 您可以将 leaf_id 作为函数参数传递给 ajaxContent。

如果没有更多关于您正在做什么的上下文,并且因为这是一个仅与特定操作相关的 transient 值,我认为最好的选择是#3:

function ajaxContent(url, id, target, data, leafID, callbackFunction) {

    $.ajax({
        async : true,
    ....        
        complete: function(){
          if(typeof callbackFunction == "function"){
            // you can access any of the ajaxContent function arguments here
            callbackFunction(leafID);
          }
        }
    });
}       

$(document).on("click", "#something", function(){
  var leaf_id = $(this).attr('rel');

  ajaxContent(url, id, target, data, leaf_id, function(leafID){

    url = "/path/" + leafID;
    window.location = url;

  })
})

或者,如果您有很多变量要传递,您可以创建一个空对象,然后将每个变量作为该对象的属性,然后将单个对象传递到 ajaxContent 和回调中,如下所示:

function ajaxContent(url, id, target, data, settings, callbackFunction) {

    $.ajax({
        async : true,
    ....        
        complete: function(){
          if(typeof callbackFunction == "function"){
            // you can access any of the ajaxContent function arguments here
            callbackFunction(settings);
          }
        }
    });
}       

$(document).on("click", "#something", function(){
  var args = {};
  args.leafID = $(this).attr('rel');

  ajaxContent(url, id, target, data, args, function(settings){

    // access args.leafID here
    url = "/path/" + leafID;
    window.location = url;

  })
})

请注意,在我的代码示例中,我将参数命名为与其他变量不同的名称,以避免混淆。

关于javascript - 进行异步 AJAX 调用后运行函数,传递变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12044805/

相关文章:

javascript - 单击并选择另一个选项时更改表单选择选项

javascript - 更好地理解 Javascript OOP 架构

javascript - Bootstrap 折叠垂直拨动开关

javascript - 函数调用javascript

javascript - 使用书签 javascript 更改范围文本的一部分?

当对象作为参数从 Angular2 组件传递时,外部 HTML 文件中的 JavaScript 函数不会被调用

javascript - 在Vue.js中,如何设置一段数据始终等于包含元素的高度?

javascript - 如何切换<td>的内容?

javascript - 替换 knockout.js 中可观察数组中的特定项目

javascript - 逻辑更改 url get 到 post 方法 jquery