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