这个JavaScript Defer代码可以简化吗?

时间:2012-11-28 11:16:15

标签: javascript jquery ajax jquery-deferred

我有一个JavaScript bootstrapper模块,我试图保持非常干净和简单:目前我的代码如下:

function bootStrapper() {
       xmlRepository.getAll().done(function (result) {
       autoPolicyForm.show();       
   });
}

在xmlRepository中我在getAll();

中使用了延迟对象
function getAll () {
    var d = $.Deferred();

    $.ajax({
        type: "GET",
        url: "http://localhost/Autopolicy/dataSource.xml",
        dataType: "xml",
        success: function (xml) {
            d.resolve(xml);
        }
    });

    return d.promise();
}

这段代码运行良好,但我真的希望将bootstrapper代码进一步简化为:

function bootStrapper() {
       var result = xmlRepository.getAll();
       autoPolicyForm.show();       
   });
}

由于调用的异步特性,我尝试的所有内容都会导致“结果”未定义。

有没有人知道如何修改代码以将复杂性转移到xmlRepository以便可以实现上述目标?

由于

1 个答案:

答案 0 :(得分:2)

在现代jQuery the ajax function中返回一个承诺,以便您可以将getAll简化为:

function getAll () {
    return $.ajax({
        type: "GET",
        url: "http://localhost/Autopolicy/dataSource.xml",
        dataType: "xml"
    });
}

换句话说,现在可以做到

$.ajax(url).done(function(xml){...});

您也可以将getAll更改为

   function fetchAll (callback) {
        $.ajax({
            type: "GET",
            url: "http://localhost/Autopolicy/dataSource.xml",
            dataType: "xml"
        }).done(callback);
    }

所以你会做

   xmlRepository.fetchAll(function (result) {
       autoPolicyForm.show(); 
   });

但是,除了将async设置为false之外,您无法避免传递函数,因为执行是异步的。你应该考虑一个javascript应用程序自然是基于事件的,所以API的用户可以使用并传递匿名函数(回调)。