我正在调用一个函数,它会将ajax GET
设为一个url,如下所示:
// parameters = url, callback, boolean
that.mapUrl( window.location.search, function(spec) {
console.log("initial mapping done");
console.log(spec);
// do stuff
}, true);
mapUrl
将触发Ajax请求。在Ajax done
或success
处理程序中,我想触发我的回调函数,但是这样做:
$.ajax({
method: 'GET',
url: obj[1],
context: $('body')
}).fail(function (jqXHR, textStatus, errorThrown) {
console.log("FAILED");
configuration = {
"errorThrown":errorThrown,
"textStatus": textStatus,
"jqXHR": jqXHR
}
}).done(function(value, textStatus, jqXHR) {
console.log("OK");
console.log(callback) // undefined!
configuration = {
"value":value,
"textStatus": textStatus,
"jqXHR": jqXHR
}
});
问题:
所以我想知道如何将我的回调函数传递到ajax
done-callback
。知道怎么做吗?
谢谢!
修改
这是完整的mapURL
函数
that.mapUrl = function (spec, callback, internal) {
var key,
obj,
parsedJSON,
configuration = {"root" : window.location.href};
if (spec !== undefined && spec !== "") {
obj = spec.slice(1).split("=");
key = obj[0];
console.log(key);
switch (key) {
case "file":
$.ajax({
method: 'GET',
url: obj[1],
context: $('body')
}).fail(function (jqXHR, textStatus, errorThrown) {
console.log("FAILED");
configuration = {
"errorThrown":errorThrown,
"textStatus": textStatus,
"jqXHR": jqXHR
}
}).done(function(value, textStatus, jqXHR) {
console.log("OK");
configuration = {
"value":value,
"textStatus": textStatus,
"jqXHR": jqXHR
}
});
break;
default:
// type not allowed, ignore
configuration.src = [];
break;
}
}
return configuration;
};
答案 0 :(得分:3)
通常最好保留“promise”接口,而不是将回调传递给代码。这样可以更好地捕获错误条件。
function mapUrl(url) {
return $.ajax(...)
.fail(...)
.then(function(data) {
// preprocess data and return it
});
}
在使用.then
的情况下,您可以在将返回的数据传递给回调之前对其进行操作:
mapUrl(...).done(function(data) {
// data has been preprocessed
...
});
如果AJAX调用失败,您此时也可以链接其他.fail
处理程序,这是您当前API不允许的。这种“关注点分离”可以让您更好地处理错误处理UI,例如,不会使用与UI相关的代码混淆您的AJAX代码。