【问题标题】:How to pause jQuery code for few milliseconds?如何暂停jQuery代码几毫秒?
【发布时间】:2019-03-25 11:39:47
【问题描述】:

我正在使用 jQuery Ajax 函数通过 cron 自动更新我的数据库。由于有很多行要更新,我想在每次迭代时暂停代码几毫秒。最好的方法是什么?

这是我的代码示例:

<?php

    $zdroje = $db->select('zdroje', 'id!=1');

    echo "<script type='text/javascript'>\n
            $(document).ready(function() {\n"; 

    foreach($zdroje as $zdroj) {

    echo "$.post( '/adminator/menu/2zajezdy/tools/01otnXml/requests.php', { 'updateXML': '".$zdroj['id']."' }, function(data) {
        // pause here!
    });\n";

    } // end: foreach

    echo "});\n</script>\n";

?>

【问题讨论】:

    标签: javascript jquery delay


    【解决方案1】:

    只有两种方法可以做到这一点:

    1. 使用 setTimeout(例如 10 毫秒):

      setTimeout(function () {
          $.post( '/adminator/menu/2zajezdy/tools/01otnXml/requests.php', { 'updateXML': '".$zdroj['id']."' }, function(data) {
              // do stuff here!
          });
      }, 10);
      
    2. For 循环(这是一个 hack,所以这不是首选):

      for(i = 0; i &lt; 500; i++);

    【讨论】:

    • 我喜欢这个想法,所以为了实现这个我只需写 ($i * 10) insted of 10,对吧?
    • 10 是执行代码之前等待的毫秒数。将其更改为对您的应用有意义的任何内容。
    【解决方案2】:

    我建议你看看 jQuery 的新延迟系统。这是一个很好的教程: http://www.erichynds.com/jquery/using-deferreds-in-jquery/

    基本上,您可以像这样创建一个“持有”承诺:

    function hold(delay){
        var dfd = $.Deferred();
    
        setTimeout(function(){
            dfd.resolve();
        }, delay);
    
        return dfd.promise();
    }
    

    然后像这样将 ajax 请求串在一起:

    $.when($.post('yourLongUrlHere'))
        .then(hold(500))
        .then($.post('anotherUrl'))
        .then(hold(500))
        .then($.post('somethingElse.php'));
    

    这将使每个 ajax 请求按顺序等待每个请求之间的 500 毫秒。

    应该处理您所询问的问题。

    【讨论】:

      【解决方案3】:

      你可以试试 .delay() 函数...

      http://api.jquery.com/delay/

      【讨论】:

        【解决方案4】:

        一种笨拙的方法可能是使用 JavaScript 的 setTimeout() 方法,但我建议您查看 jQuery 函数 $.ajaxComplete()$.ajaxStart()$.ajaxStop()

        【讨论】:

        • 好吧,真的没有像 pause(1); 这样的东西。功能? =/
        • 浏览器的JS没有同步阻塞暂停功能。这就是事情的工作方式:)
        【解决方案5】:

        我想你想生成链式调用而不是普通列表。 IE。你现在得到的是:

        $.post(...)
        $.post(...)
        ...
        $.post(...)
        

        你想要得到这样的东西:

        $.post(url1, function(data) {
            setTimeout(function() {
                $.post(url2, function(data) {
                    setTimeout(function() {$.post(url3)}, 500);
                });
            }, 500);
        });
        

        如果您使用 PHP 来生成 JavaScript 代码 - 生成这样的代码应该不会太难。希望这会有所帮助。

        编辑:尝试像这样生成它

        $code = "%s";
        foreach($sources as $source) {
           $part = "$.post( '/adminator/menu/2zajezdy/tools/01otnXml/requests.php', { 'updateXML': '${source['id']}' }, function(data) {
              setTimeout(function() {
                 %s
              }, 500);
           });"
           $code = sprintf($code, $part);
        }
        $code = sprintf($code, '');
        

        【讨论】:

        • 嗯,这也可以,但是您如何看待 tjameson 的回答以及什么会更好?
        • 好吧,#2 他的回答是 hack(如前所述:))并且不保证任何事情。 #1 点是我提供的解决方案的良好开端。看,如果你一个接一个地做几个 setTimeout(post, 500) - 你最终会暂停第一次通话,但在通话之间根本不能保证暂停,而我帖子中的解决方案肯定会在帖子之间暂停
        • 很好地添加了 foreach 以生成嵌套的 setTimeouts。这可能比我的要好,因为它可以保证 post call 之间有 500 毫秒的中断。
        【解决方案6】:

        您不能暂停 JavaScript 引擎处理代码。 JS 具有异步运行的代码 - 例如,来自 AJAX 请求的响应返回并执行回调函数。

        setTimeout 是延迟执行特定功能的最佳朋友。

        //Executes an alert exactly 1 second later
        setTimeout(function() {
           alert('hello world'); 
        }, 1000);
        

        【讨论】:

          猜你喜欢
          • 2022-07-13
          • 2011-05-05
          • 1970-01-01
          • 1970-01-01
          • 2020-05-03
          • 1970-01-01
          • 2015-05-02
          • 1970-01-01
          • 2010-11-07
          相关资源
          最近更新 更多