jQuery 动态拉取函数调用完成时

jQuery When Done on dynamically pulled function call

我有以下代码:

现场-code.js

.....

var ajaxContentFunc = $(origin).data("modal-content-handler");

$.when(window[ajaxContentFunc]()).done(function (resp) {
    kModal.showContent(resp);
});

在另一个文件中我有以下标签和函数

<a href="#" data-modal-content-handler="ajaxContentGeneration">Click Me</a>

.....

function ajaxContentGeneration() {

    var aProm = $.ajax({

        url: "tests/ajax/AjaxTest.aspx",
        data: { exampleType: "modal-ajax" },
        dataType: "html"


    });


    aProm.done(function (data) {

        console.log("Ajax Loaded!");
        var content = $(data).find("#ajax-content");

        return aProm;

    });


}

我需要将 ajaxContentGeneration(无论可能是什么方法)的结果填充到要发送到 showContent 的变量中,换句话说:

1) 从标签的 modal-content-handler 数据属性中提取 ajaxContentFunction 名称

2) 调用函数(在本例中为 ajaxContentGeneration)

3) 等待函数的 ajax 完成并 return 生成数据(在本例中 html)

4) 完成后将该值传递给 kModal.showContent(----这里----);

但是目前我得到:

1) 正确提取 ajaxContentFunctionName

2) 调用函数(ajaxContentGeneration() 函数)

3) 调用 kModal.showContent(未定义)。这被过早调用,因为延迟没有正确等待函数调用完成(在 ajax 完成后)。

4) Ajax 完成

我哪里搞砸了?

据我所知,你已经完成了 95%。

使用 .then() 代替 .done() 和 return return 由 $.ajax().then() 编写的承诺:

function ajaxContentGeneration() {
    return $.ajax({
        url: "tests/ajax/AjaxTest.aspx",
        data: { exampleType: "modal-ajax" },
        dataType: "html"
    }).then(function (data) {
        return $(data).find("#ajax-content"); // this will return jQuery
        // return $(data).find("#ajax-content").html(); // this will return html
    });
}

您或许还可以从顶级调用中清除 $.when() :

var ajaxContentFunc = $(origin).data("modal-content-handler");
window[ajaxContentFunc]().then(function (resp) {
    // `resp` is whatever was returned by the `return $(data).find()...` statement above
    kModal.showContent(resp);
});

我说 "probably" 的原因是如果可以调用 value-returning(而不是 promise-returning)函数而不是调用 $.when() ajaxContentGeneration().

另一种方法是:

// should really be renamed...
function ajaxContentGeneration(){
    return $.ajax({
        url      : "tests/ajax/AjaxTest.aspx",
        data     : { exampleType: "modal-ajax" },
        dataType : "html"
    })
}

其他地方:

var ajaxContentFunc = $(origin).data("modal-content-handler");

window[ajaxContentFunc]()
    .done(function(RES){
        kModal.showContent( $(RES).find("#ajax-content") );
    });

因此 ajaxContentGeneration 函数的功能将是 return 一个 AJAX 承诺,而不是在其中进行操作,而是在需要的地方进行操作(从响应中获取 #ajax-content 元素)


请注意,这整件事都是糟糕的 JS 设计实践,您应该避免在 window 对象之上使用函数,而是在另一个对象上。