1

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

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();
}

这段代码运行良好,但我真的很想将引导程序代码进一步简化为:

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

由于调用的异步性质,我尝试的一切都会导致“结果”未定义。

有谁知道如何修改代码以将复杂性移至 xmlRepository 以便实现上述目标?

谢谢

4

1 回答 1

2

在现代 jQuery中,ajax 函数返回一个承诺,因此您可以简化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 的用户可以使用和传递匿名函数(回调)。

于 2012-11-28T11:17:31.983 回答