我正在将一堆旧的dojo升级到1.8。对于我们的ajax请求处理,我们有一个装饰器(好的,函数包装器),它将在某些情况下根据响应内容执行重定向,例如:
// 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
})
});
现在,在dojo 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
。检查延迟(通过断开链接)似乎也不起作用,并且需要比我想要的更多重新设计。
有什么想法吗?
谢谢Ken(也是#dojo的帮助)。要详细说明,解决方案是使用dojo/request
并使用.response
延迟的承诺,这将提供必要的信息:
// 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
}));
答案 0 :(得分:2)
从dojo/request
返回的Prom实际上是具有额外response
承诺的对象,可提供更多信息。有关信息,请参阅以下地点: