.html()无法在异步代码中工作

时间:2014-01-06 19:49:51

标签: javascript jquery asynchronous callback

我有一些类似的代码:

function myFunction(){
    $('#somediv').html("Making request...");
    $.get('/script.php',
        function(data){
            if(data.error == 0){
                $('#somediv').html("yay!");
            } else {
                $('#somediv').html("oops!");
                window.setTimeout(myFunction(), 2000);
            }
        },
        'json'); 
}

" oops!"从不显示,我相信可能是因为$ .get()请求是异步调用的。我可以显示的唯一方法是将它包装在window.setTimeout()中或在它之前运行alert()。

2 个答案:

答案 0 :(得分:0)

逐行跟踪您的代码,您就会明白发生了什么。

function myFunction(){
    $('#somediv').html("Making request...");
    $.get('/script.php',
        function(data){
            if(data.error == 0){
                $('#somediv').html("yay!");
            } else {
                $('#somediv').html("oops!");
                myFunction();
            }
        },
        'json'); 
}
  1. $('#somediv').html("Making request...");
  2. $.get()
  3. // waiting for ajax request...
  4. $('#somediv').html("oops!");
  5. $('#somediv').html("Making request...");
  6. 步骤4和5最有可能在0.01毫秒内发生,这就是为什么你永远不会看到“哎呀!”。

    您可以在myfunction周围使用settimeout来显示oops,但最好不要显示任何内容,以便继续说“Making Request ...”。

答案 1 :(得分:0)

使用:

window.setTimeout(myFunction, 2000);

而不是

window.setTimeout(myFunction(), 2000)

window.setTimeout(myFunction(), 2000);调用myFunction(),与window.setTimeout(undefined, 2000)相同,因为myFunction()会返回undefined

但是当调用myFunction时,您使用$('#somediv').html("Making request...");重写html。