0
我正在将一堆旧dojo升级到1.8。对于我们的AJAX请求处理,我们已经有了一个装饰(当然,函数包装),将执行基于响应内容某些情况下重定向,例如:现在从回调函数访问ioArgs
// Decorator func:
var redirectDecorator = function(func) {
var f = function(data, ioArgs) {
if(data.redirect) {
// A manual location redirect:
window.location.href = data.redirect;
if(data.redirect_xhr) {
// clone ioArgs, spawn new request to follow redirect etc
// <snip>
} else {
func(response);
}
}
return f;
}
// Used like so:
dojo.xhrPost({
url: url
handleAs: "json",
form: form,
load: redirectDecorator(function(data, ioArgs) {
// do stuff
})
});
,在道场1.8(该dojo/request/xhr模块) xhr()
返回一个Deferred
链接和回调只提供data
参数(没有ioArgs
- 显然这些都附加到诺言 - 见http://bugs.dojotoolkit.org/ticket/12126)。
换言之,上述的AJAX调用变为:
xhr.post(url, {
handleAs: "json",
form: form
}).then(function(data) {
// do stuff
});
问题是,我不能再包裹匿名功能,因为ioArgs
不提供。检查延期(通过打破链接)似乎也不工作,并需要更多的重新设计比我想。
任何想法?
谢谢肯(在#dojo也有帮助)。为了详细说明,该解决方案是使用dojo/request
和使用.response
递延承诺相反,它提供了必要的信息:从dojo/request
返回
// Decorator func:
var redirectDecorator = function(func) {
var f = function(response) {
var data = response.data;
if(data.redirect) {
// A manual location redirect:
window.location.href = data.redirect;
if(data.redirect_xhr) {
request(data.redirect_xhr, response.options).then(func);
} // more conditions follow.
}
return f;
}
request.post(url, {
handleAs: "json",
form: form
}).response.then(redirectDecorator(function(response) { // <-- note .response.then(
// do stuff where data is response.data
}));