在每个循环完成后执行一个函数

时间:2010-11-23 00:54:25

标签: jquery ajax settimeout each program-flow

嘿那里, 我正在研究一个jQuery each() - 包含ajax-request和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()是立即触发的(当循环仍在处理数据时)。是否有任何简单的可能性等待循环完成? \:

祝你好运!

1 个答案:

答案 0 :(得分:1)

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

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

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

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