jQuery:在一个函数内部,在另一个函数内部意识到完成的promise

时间:2015-12-23 19:13:21

标签: jquery deferred

一些上下文

尽管有六个小时的阅读时间,包括官方文档,我仍然无法绕过承诺的实施。 (我得到了核心概念。)在函数X中,我有多个ajax调用。我已经能够确定所有Y ajax调用何时完成(但是,我仍然没有完全掌握语法产生结果的 )。

需要

但是,我仍然需要让函数X(另一个函数)的调用者知道所有Y ajax调用都已完成。这是一个简化/半伪代码示例。 (我想知道我之前的尝试是否由于范围问题而失败,但我没有看到延迟对象传递给我见过的示例中的函数。我决定将下面的示例保持为“干净”而不是显示特定的尝试失败。)

$.fn.SendEmails = function (emailsToSend) {

    var emailSendingPromises = [];

    $.each(emailsToSend, function (i, p) {
        emailSendingPromises.push($.ajax({
            // relevant stuff
        })
        .done( function () {
            console.log('one email done');
        })
        .fail( function () {
            console.log('one email failed');
        }));
    });

    // when all promises have completed 
    $.when.apply($, emailSendingPromises).always(function () {
        console.log('all emails completed');
        // --- MAKE CALLER AWARE ALL EMAILS ARE COMPLETED ---
    });
}


$.fn.AnotherFunction = function () {

    $().SendEmails(emailsToSend);

    // --- BECOME AWARE THAT ALL EMAILS ARE COMPLETED ---

    // do other stuff only when all emails are completed AND some other things happen
}

非常感谢您的帮助! :)

1 个答案:

答案 0 :(得分:1)

首先,在您的$.when功能中尝试SendEmails AnotherFunction。然后,在您的$().SendEmails(emailsToSend)拨打此电话后.then(),添加$().SendEmails(emailsToSend).then(function() { /* other stuff */});

.then()

Alt-Click SomeNameTest.java Run as -> Maven Test 只有在返回的承诺解决后才会触发。