【问题标题】:How to use promises in jquery?如何在 jquery 中使用 Promise?
【发布时间】:2020-09-04 11:04:07
【问题描述】:

我通过多个 ajax 调用拉入多个 div。在第一个 ajax 调用之前,我想显示一个加载微调器。一旦加载了所有 div(这将花费未知时间),我想对它们进行排序。最后我想删除加载微调层。

我认为我需要为此使用 Promise(因为有多个 ajax 调用)但是我不明白如何实现 Promise - 有人可以告诉我如何编写 Promise 以及我是否需要向我的与此相关的功能请问要添加什么?

非常感谢。

这是我的代码:

$(document.body).on('click', "#refresh_view", function(){

    start_spinner();
    load_all_divs(list_of_ids_to_loop_over);

    // once the above is complete
    re_order_divs();

    // once the above is complete
    end_spinner();

});


load_all_divs(list_of_ids_to_loop_over) {

    $.each(list_of_application_ids.split(','), function(index){
        do_ajax_call_for_this_one_item(this)
    });
};


【问题讨论】:

    标签: jquery jquery-deferred


    【解决方案1】:

    如果您使用 jQuery 的 $.ajax(或 $.get 等)加载 div,则可以使用 jQuery 的 $.when,因为它们已经返回 jQuery jqXHR 对象,它们类似于 promise:

    $.when(
        $.ajax(/*...*/),
        $.ajax(/*...*/),
        $.ajax(/*...*/)
    )
    .done(() => {
        // All done
    })
    .fail(error => {
        // Something went wrong
    });
    

    如果您使用的是最新版本的 jQuery,您也可以使用标准的 Promise.all,因为现代版本的 jQuery 中的 jqXHR 对象是thenablePromise.all 接受一个数组:

    Promise.all([
        $.ajax(/*...*/),
        $.ajax(/*...*/),
        $.ajax(/*...*/)
    ])
    .then(() => {
        // All done
    })
    catch(error => {
        // Something went wrong
    });
    

    【讨论】:

    • 谢谢。 ajax 调用在 load_all_divs() load_all_divs(list_of_ids_to_loop_over) { $.each(list_of_application_ids.split(','), function(index){ do_ajax_call_for_this_one_item(this) }); }; 内的 .each 循环中,所以我将如何履行我的承诺?感谢您的帮助,我想我明白了 Promise 的概念,但我不明白我在哪里/如何创建 Promise,在事情完成后更新它,并使下一个需要运行的事情等到该 Promise 完成.一旦我明白了这一点,我想我需要了解如何将它们锁起来!
    • @happysailingdude - 将调用结果保存在数组中并在数组上使用Promise.allPromise.all(list_of_application_ids.split(',').map(do_ajax_call_for_this_one_item)).then(function() { /* ...all done... */ }).catch(function(error) { /* ...handle/report error... */});
    • 感谢 TJ - 不幸的是,我不知道如何将 ajax 调用的结果保存到数组中。我希望我可以保留 load_all_divs() ,因为它比我上面的代码要复杂得多(但可能会添加一个 promise 对象?)并重写触发的代码,然后点击事件发生以使用 promises..对不起,我的 javascript 相当简陋
    猜你喜欢
    • 2013-04-07
    • 2015-10-08
    • 1970-01-01
    • 2018-09-28
    • 2015-10-01
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 2016-07-15
    相关资源
    最近更新 更多