【问题标题】:Executing a function after each-loop has completed在每个循环完成后执行一个函数
【发布时间】:2011-05-14 04:45:48
【问题描述】:

你好, 我正在开发一个 jQuery each()-loop,其中包含一个 ajax 请求和一个 setTimeout。这给我的程序流程带来了一些问题。

xml_queries: function (data) {
    var values = [];

    // ...

    $.each(data, function(index, value) {

        // ...

        // Start xml query
        var i = 0;
        get_data(value.value);

        function get_data(value) {
            $.ajax({
                type: 'POST',
                url: '/admin/scanner/get_music_data/' + value,
                dataTaype: 'json',
                success: function(response) {
                    if ( response === 'FALSE' ) {
                        // Start recursion - up to 3 Retries
                        if ( ++i <= 3 ) {
                            setTimeout(function() {
                                get_data();
                            }, 100);
                        } else {
                            // ...
                        }
                    } else {
                        values.push(response);
                    }
                }
            });
        }
    });
    // return values;
    console.log(values);
}

我的问题是最后一行中的 console.log() 被立即触发(而循环仍在处理数据)。等待循环完成是否有任何简单的可能性? \:

最好的问候!

【问题讨论】:

  • 这是常见的 Ajax-is-asynchronous 问题。关于 SO 有 的问题,以一种或另一种方式解决。

标签: jquery ajax settimeout each program-flow


【解决方案1】:

根据您当前的代码,最直接的方法是将 $.ajax 的 async 选项设置为 false,以强制同步请求,导致 JavaScript 在继续执行后续语句之前等待它完成(它异步请求不会这样做)。

$.ajax(
   {
    type: 'POST',
    async: false,
    ...

这将在每个请求期间阻止您的浏览器(糟糕)。另一种方法是重新设计您的应用程序,以便从第一个成功回调中调用下一个 ajax 调用,例如:

$.ajax(
   {
    type: 'POST',
    ...
    success: function() {
        doAjaxThingie();
    }

【讨论】:

  • 更好地解释异步行为 - 但我对这些问题感到恶心
  • 非常感谢,这很简单。在我尝试寻找解决方案时,我读到 setTimeout 会导致该问题。 Btw:同步处理是多线程完成的吗?
  • @Matt - 很公平。我已经回答了至少六七次。我认为它反复出现的原因之一是因为此类问题的措辞非常不一致,通过谷歌搜索似乎很难找到。也许我们应该对 SO 制定一个政策,让他们获得额外的标签“异步”:)
  • 我完全同意 - 考虑到这种情况出现的次数,可能需要对元数据进行一些讨论。
猜你喜欢
  • 2015-03-04
  • 1970-01-01
  • 2018-07-20
  • 2018-12-27
  • 1970-01-01
  • 2019-11-16
  • 2013-11-09
  • 1970-01-01
  • 2021-02-15
相关资源
最近更新 更多