【问题标题】:.html() not working in async code.html() 在异步代码中不起作用
【发布时间】:2014-01-24 07:58:55
【问题描述】:

我有一些类似这样的代码:

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'); 
}

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

【问题讨论】:

  • "oops" 从不显示???
  • $('#somediv').html("oops!");
  • 你确定success方法真的被调用了吗?
  • 您将立即重新执行 myfunction,这会立即再次将其 html 设置为“Making Request...”,删除“oops”。请按照代码一行一行开始调试。
  • 见@IonicăBizău 的回答。

标签: javascript jquery asynchronous callback


【解决方案1】:

用途:

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。

【讨论】:

    【解决方案2】:

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

    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...");

    第 4 步和第 5 步最有可能在 0.01 毫秒内发生,这就是为什么您永远不会看到“哎呀!”。

    您可以在 myfunction 周围使用 settimeout 来使 oops 可见,但最好不要显示任何内容,以便它继续说“正在发出请求...”。

    【讨论】:

    • 嘿,谢谢。我想到了这个并添加了一个 window.setTimeout() (我忘记将它包含在我的示例代码中。但是,问题仍然存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    相关资源
    最近更新 更多