0

Dojo 1.6 で延期された ajax リクエストのヒッチングとチェーン化で小さな問題が発生しました。コードは次のようになります

    login : function(data) {            
        var def = lang.hitch(this.authenticate, this.authenticate(data));
        console.log(def); // [I]
        return def;
    },

    authenticate : function(data) {
        require([ "dojo/Deferred", "dojo/request/xhr", "dojo/_base/lang",
                "dojox/encoding/digests/MD5" ], lang.hitch(this, function(Deferred, xhr,
                lang, MD5) {
            var data2send = lang.mixin(data, {
                action : "authenticate",
                password : "21232f297a57a5a743894a0e4a801fc3",
                userId : data.username
            });

            return xhr(this.handlerUrl, {
                handleAs : "json",
                method : "POST",
                sync : false,
                data : data2send
            });
        }));
    }

login() が呼び出される場所。私見では、authenticate() の ajax-request が終了した後に解決される Deferred-object を返す必要があります。したがって、[I] にログインすると Deferred-promise が返されるはずですが、Firebug は戻り値を function() としてログに記録しています。誰でも助けてくれることを願っています。

前もって感謝します!

編集: 別の質問は、def がオブジェクトになる理由です。これは、lang.hitch の最初の引数によって指定されます。たとえば、ログの上のコードでは、「function()」が表示されます。最初の引数を「this」に変更すると、ログには「this」オブジェクト (「Object {...}」) 自体が表示されます。ヒッチのメカニズムは戻り値に影響を与えず、スコープを2番目の引数(呼び出された関数)にのみヒッチすると仮定しました。私が間違っている?!

4

1 に答える 1

0

コードは最終的に次のようになります。

define([ "dojo/_base/lang", "dojo/_base/declare", "dojo/Deferred",
    "dijit/_Widget" ], function(lang, declare, Deferred) {
return declare("LoginController", null, {
    handlerUrl : "sessionHandler.php",
    constructor : function(kwArgs) {
        lang.mixin(this, kwArgs);
    },

    login : function(data) {
        def = new Deferred();
        auth = this.authenticate(data);
        auth.then(function(success) {
            if (success.success == true) {
                def.resolve(true);
            } else {
                def.resolve(false);
            }
        }, function(err) {
            def.resolve(false);
        });
        return def;
    },

    authenticate : function(data) {
        var def = new Deferred();
        require([ "dojo/request/xhr" ], lang.hitch(this, function(xhr) {
            var data2send = lang.mixin(data, {
                action : "authenticate",
                userId : data.userId
            });

            xhr(this.handlerUrl, {
                handleAs : "json",
                method : "POST",
                sync : false,
                data : data2send
            }).then(function(data) {
                def.resolve(data);
            }, function(err) {
                def.reject(err);
            });

        }));
        return def;
    }
});
});

前に Deferred を設定せずに、require の非同期呼び出しを回避することはできませんでした。したがって、Deferred コンストラクターは define ステートメント内で最初にロードする必要があるため、関数内で非同期に要求する必要はありません。

于 2013-01-12T10:31:51.210 に答える