0

我有 2 个带有 ajax 调用的函数。如何使用在 function1 中返回的 function2 中的变量。

function func1 (){
  $.ajax({
      url:"",
      dataType: 'json',
      success: function(data){
          var foo
      }
  });  
  //How can i use var foo in func2(foo)?
  //i try .done(func2(foo)); but it returns foo is not define
}

    function func2 (param){
       $.ajax({
         url:"",
         dataType: 'json',
         success: function(data){
       }
     });
     }
4

4 回答 4

4
    function func1 (){
      var foo;
      $.ajax({
          url:"",
          dataType: 'json',
          async: false,
          success: function(data){
              foo = ...
          }
      });  
      func2(foo)
    }

您应该将async设置为 false,或者您可以在成功处理程序中执行 func2。

于 2012-09-22T18:08:47.687 回答
1

您必须将变量foo全局设置asyncfalse,以便浏览器可以在执行 func2 之前等待执行 func1:

var foo;
function func1 (){
  $.ajax({
      url:"",
      dataType: 'json',
      async: false,
      success: function(data){
          foo = ...
      }
  });  
  //How can i use var foo in func2(foo)?
  //i try .done(func2(foo)); but it returns foo is not define
}

function func2 (param){
   $.ajax({
     url:"",
     dataType: 'json',
     success: function(data){
         alert(foo)
   }
 });
 }

正如 Ozerich 所说,您也可以在不初始化 var 的情况下完成它;但是初始化所有变量是一个好习惯。

请记住,如果您在成功回调中再次初始化变量(var foo再次使用),您将引用一个名为 foo 的新变量,而不是全局变量。

您可以了解更多关于 javascript 变量范围搜索网络的信息。https://stackoverflow.com/a/500459/407456

顺便说一句,您应该考虑在 func1 的success回调中执行 func2。

于 2012-09-22T18:17:48.517 回答
0

只需调用func2()withing func1()AJAXsuccess函数:

function func1() {
    $.ajax({
        url: "",
        dataType: 'json',
        success: function(data) {
            var foo = data;
            func2(foo);
        }
    });
}

function func2(param) {
    $.ajax({
        url: "",
        dataType: 'json',
        success: function(data) {}
    });
}​

或者

您可以使用如下回调函数:

function func1(callback) {
    $.ajax({
        url: "",
        dataType: 'json',
        success: function(data) {
            var foo = data;

            // pass foo variable
            // as callback parameter
            callback(foo);
        }
    });
}

function func2(param) {

    // here call func1() with a
    // callback function argument

    func1(function(foo) {
      $.ajax({
        url: "",
        dataType: 'json',
        success: function(data) {}
      });
   });
}​

根据关于$.ajax() 的jQuery 文档async

从 jQuery 1.8 开始,不推荐在 jqXHR ($.Deferred) 中使用async: false ;您必须使用完成/成功/错误回调。

于 2012-09-22T18:16:49.687 回答
0

我不确定您到底想要完成什么。

如果你想在第一个之前等待第二个 ajax 调用,你应该async: false在 ajax 选项中使用,或者使用回调:

function func1 (callback){
  $.ajax({
      url:"",
      dataType: 'json',
      success: function(data){
          var foo;
          if (typeof callback != 'undefined')
              callback(foo);
      }
  });  
}


function func2 (param){
   $.ajax({
     url:"",
     dataType: 'json',
     success: function(data){
   });
 }

func1(func2);

但是,如果您希望同时进行两个 ajax 调用,但第二个函数应该在某个代码块之前等待第一个函数的结果,则需要在两个函数中定义回调到第三个函数,该函数检查是否下载了所有数据然而,然后才执行代码。

于 2012-09-22T18:17:20.630 回答