0

たくさんの古い道場を 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
}));
4

1 に答える 1

2

から返されるPromise は、実際には、より多くの情報を提供する追加の promise をdojo/request持つオブジェクトです。response情報については、次の場所を参照してください。

于 2012-11-14T22:39:38.573 に答える