jQuery:在一个函数内,了解另一个函数内完成的承诺

jQuery: inside one function, become aware of completed promise inside another function

一些上下文

尽管阅读了六个小时(包括官方文档),但我仍然难以理解 promises 的实现。 (我明白了核心概念。)在函数 X 中,我有 Y 次 ajax 调用。我已经能够确定所有 Y ajax 调用何时完成(虽然,我仍然没有完全掌握 如何 语法产生结果)。

需要

但是,我仍然需要让函数 X(另一个函数)的 caller 知道所有 Y ajax 调用已经完成。这是一个简化/半伪代码示例。 (我想知道我之前的尝试是否因为范围问题而失败,但在我看到的示例中我没有看到延迟对象传递给函数。我决定保留下面的示例 "clean" 而不是显示一次失败的尝试。)

$.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
}

非常感谢您的帮助! :)

首先,尝试在 SendEmails 函数中 returning 您的 $.when。然后,在您的 AnotherFunction 中,在您进行此调用后:$().SendEmails(emailsToSend),添加一个 .then():

$().SendEmails(emailsToSend).then(function() { /* other stuff */});

.then() 仅在返回的承诺已解决后才会触发。