我有一个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以便可以实现上述目标?
由于
答案 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的用户可以使用并传递匿名函数(回调)。