たくさんの古い道場を 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()
a が返さDeferred
れ、コールバックには引数のみが提供されdata
ます (いいえioArgs
- どうやらこれらは promise に添付されているようです - http://bugs.dojotoolkit.org/ticket/を参照してください)。 12126)。
つまり、上記の ajax 呼び出しは次のようになります。
xhr.post(url, {
handleAs: "json",
form: form
}).then(function(data) {
// do stuff
});
問題は、提供されていないため、無名関数をラップできなくなったことioArgs
です。延期されたものを(チェーンを壊して)検査してもうまくいかないようで、私が望むよりも多くの再設計が必要になります。
何か案は?
ケンに感謝します(#道場でもお世話になりました)。詳しく説明すると、解決策は、必要な情報を提供する deferred promise を代わりに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
}));