javascript函数返回值混淆

时间:2011-06-13 15:09:52

标签: javascript ajax

我不清楚以下虚拟代码的返回值:

function foo()
  var ret = 0;
  var xhr=send_request( "bla", function() {
      // do something with the AJAX response
      // based on the value of response, var ret get set
  } );
  return ret;
}

我想要实现的是:基于AJAX响应,我可能会决定再次尝试请求。但无论如何,上面的函数总是返回0。

显然我可以让foo()函数决定在需要时调用send_request()两次,但它有点难看。有没有一种简单而好的方法来做到这一点?

由于

4 个答案:

答案 0 :(得分:7)

您正在尝试同步进行ajax调用,但您正在进行异步调用。

重要的是要了解它的编写方式,代码不会等到AJAX调用完成后再转到下一行。因此,它始终返回ret 的初始值。

要做好几件事来解决这个问题:

  • 使用jQuery(如果您还没有)
  • 使用jQuery的ajax()函数,并将async设置为false。

应该是这样的:

function foo()
    var ret = $.ajax({ url: "blah",
                       async: false
                     }).responseText;

    // do your stuff here

    return ret;
}

编辑:可以通过异步调用执行此操作,但您必须调整您对问题的思考方式。而不是考虑返回值,你必须考虑回调函数。

为了举例,我想说我正在尝试获取用户的名字并将其放在页面上。我的代码看起来像这样:

function GetUsername() {
    $.ajax( { url: "blah",
              success: PopulateUsername    // Specify a callback
            });
    // I don't do anything else. Execution will continue when the
    // callback gets called from the AJAX call.
}

function PopulateUsername(data) {
    alert(data);
    // Anything else I want to do, I do here, because it is only 
    // here that I have access to the result.
}

GetUsername();  // I call GetUsername() here, and that's it. Any
                // further actions that need to happen are going to
                // occur in the callback function

答案 1 :(得分:0)

变量ret在函数中具有局部范围。因此,每次调用它时,变量都会初始化为0。

此外,当函数返回变量ret时,send_request函数(将其他东西设置为ret)尚未运行,因为返回的值始终为0必须在函数返回后,ajax请求完成,send_request函数将新值设置为ret

答案 2 :(得分:0)

如果您想保持同步,请使用Stargazer712的建议。

您可以尝试使用以下内容保持异步:

function foo(callback)
  var xhr=send_request( "bla", function(result) {
     callback(result)
  } );
}


function test(result) {
  // test result here 
  if(result != "what I want")
     foo(test);   // repeat the ajax call under certain conditions
  else
     alert("got it");
}


$(function() {
  foo(test);
});

这将重复ajax请求,直到响应与某个值匹配。

答案 3 :(得分:0)

您不希望从将要进行AJAX调用的函数返回一个值,因为在函数返回之前AJAX请求将不会完成(并且个人而言,我不同意您应该将异步设置为异步的答案)假)。你想做这样的事情:

function retFunction(val) {
  // Do something here for various values of val
  if (val == 0) {
    // Something
  } else if (val == 1) {
    // Something else
  }
}

function foo()
  var xhr=send_request( "bla", function() {
    var myResult = 0; // Something here based on return values.
    retFunction(myResult);
  });
}