javascript - then 中的函数在 when 结束之前被调用

标签 javascript jquery .when

我不明白为什么 JQuery 不等到一个函数结束。我正在使用 when().then() 子句,第一个函数返回 AJAX 调用。

$('#id_language_from').on('change', function () {
        blockLoader();
        var rtl = refreshTargetLanguages();
        var rstl = refreshSummaryTargetLanguages();
        $.when(rtl).then(rstl).then(unblockLoader);

    });

问题是 rSTL 必须等到 rtl 结束,但它没有结束。

CHROME CONSOLE:(RSTL 应位于 DONE SUCCESS RTL 之后)

RTL
RSTL
...
DONE SUCCESS RTL

RTL 和 RSTL

function refreshTargetLanguages() {
    console.log('RTL');
    var language_id = $('#id_language_from').val();
    if (language_id != '') {
        var request_url = '/orders/ajax/get-languages-to-exclude/';
        return $.ajax({
            url: request_url,
            method: 'post',
            data: {'language_id': language_id},
            success: function (data) {
                $('.class_target_languages').show();

                window.changeunbind = 1;

                $('.target_language_choice.active').trigger('click');

                window.changeunbind = 0;

                $.each(data, function (key, value) {
                    hideTargetLanguageById(key);
                });
                console.log('DONE SUCCESS RTL')
            }
        })
    } else {
        console.log('call HATL');
        return hideAllTargetLanguages();
    }
}

function refreshSummaryTargetLanguages() {
    console.log('RSTL');
    var summ_ul_targ_langs = $('#summary_target_languages > ul');
    $('#id_summary_price').text('');
    var active_languages = $('.target_language_choice.active');
    console.log(active_languages);
    var words_count = $('#id_word_count').text();
    if (active_languages.length < 1 || !Boolean(words_count)) {
        console.log('emtpy');
        return summ_ul_targ_langs.find('ul').empty();

    }
    blockLoader();
    var active_languages_ids = [];
    active_languages.each(function () {
        active_languages_ids.push($(this).attr('data-pk'));
    });
    var source_language_id = $('#id_language_from').val();

    var summ_ul_targ_langs = $('#summary_target_languages > ul');
    summ_ul_targ_langs.empty();
    if ((words_count == '') || (words_count == 'NA')) {
        return
    }
    return $.post('/orders/languages-prices/', {
        'word_count': words_count,
        'language_from_id': source_language_id,
        'languages_to_ids': active_languages_ids
    }).done(function (response) {
        var estimated_price = response['estimated_price'];
        var items = response['items'];
        $.each(items, function (_, item) {
            var name = item['name'];
            var id = item['id'];
            var price = item['price'];
            var price_per_word = item['price_per_word'];
            summ_ul_targ_langs.append('<li>' + name + ': ' + price_per_word + ' x ' + words_count + ' = ' + price + '</li>');
        });
        $('#id_summary_price').text(estimated_price + ' €');
        console.log('DONE RSTL')


    });

}

你知道问题出在哪里吗?

编辑

根据安东尼的回答,我已将 RTL 更改为:

function refreshTargetLanguages() {
    console.log('RTL');
    var language_id = $('#id_language_from').val();
    var deferred = $.Deferred();
    if (language_id != '') {
        var request_url = '/orders/ajax/get-languages-to-exclude/';
        $.ajax({
            url: request_url,
            method: 'post',
            data: {'language_id': language_id}
        }).then(function(data){
            $('.class_target_languages').show();

            window.changeunbind = 1;

            $('.target_language_choice.active').trigger('click');

            window.changeunbind = 0;

            $.each(data, function (key, value) {
                hideTargetLanguageById(key);
            });
            console.log('DONE SUCCESS RTL');
            deferred.resolve();
        }, function(error){
            deferred.reject(error);
        });
    } else {
        console.log('call HATL');
        hideAllTargetLanguages();
        deferred.resolve();
    }
    return deferred.promise();
}

这也没有帮助......

enter image description here

最佳答案

您应该将该函数传递给then(),但您是在ajax之前执行该函数

var rSTL=refreshSummaryTargetLanguages()

应该是

var rSTL=refreshSummaryTargetLanguages

或者您可以将所有内容放入一行 refreshTargetLanguages().then(refreshSummaryTargetLanguages).then(unblockLoader);

可能与问题无关,我还会稍微修改 refreshTargetLanguages ,以便它返回一个 promise ,直到 console.log('DONE SUCCESS RTL ') 已记录

function refreshTargetLanguages() {
    console.log('RTL');
    var language_id = $('#id_language_from').val();
    var deferred = $.Deferred();
    if (language_id != '') {
        var request_url = '/orders/ajax/get-languages-to-exclude/';
        $.ajax({
            url: request_url,
            method: 'post',
            data: {'language_id': language_id}
        }).then(function(data){
            $('.class_target_languages').show();

            window.changeunbind = 1;

            $('.target_language_choice.active').trigger('click');

            window.changeunbind = 0;

            $.each(data, function (key, value) {
                hideTargetLanguageById(key);
            });
            console.log('DONE SUCCESS RTL');
            deferred.resolve();
        }, function(error){
            deferred.reject(error);
        });
    } else {
        console.log('call HATL');
        hideAllTargetLanguages();
        deferred.resolve();
    }
    return deferred.promise();
}

关于javascript - then 中的函数在 when 结束之前被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41914804/

相关文章:

javascript - 如何在动态列表中设置初始值?

javascript - 如何在 html5 中仅将 <base> 标记用于特定的 anchor 标记

javascript - jQuery:让第二个函数等待执行,直到第一个函数完成

javascript - 使用相同的完成函数运行多个相似的 ajax 调用(输入数据不同)的正确方法

javascript - 当我提供的 JSON 看起来有效时,数据表返回表中没有可用数据

Javascript - Canvas - 在先前填充的颜色上覆盖透明的 png

javascript - 导入 typescript 时如何在路径中使用变量

JavaScript 只能在 Chrome 浏览器中运行,不能在 Firefox 中运行

javascript - 带序号的 nvd3 散点图

javascript - 对函数调用进行排序