Dojo 1.6延迟链接和搭便车问题

时间:2013-01-10 18:33:10

标签: javascript dojo chaining deferred

我在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()。 Imho,它应该返回一个Deferred-object,它在authenticate()中的ajax-request完成后解析。因此,登录[I]应该给我一个Deferred-promise,但是Firebug将返回值记录为function()。我希望任何人都可以提供帮助。

提前致谢!

编辑: 另一个问题是,为什么def成为对象,这是由lang.hitch的第一个参数给出的。例如。在上面的代码中,日志给了我“function()”。当我将第一个参数更改为“this”时,日志会给我“this” - 对象(“Object {...}”)本身。我假设故障的机制不影响返回值,但只将范围挂钩到第二个参数(这是被调用的函数)。我错了吗?!

1 个答案:

答案 0 :(得分: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;
    }
});
});

我没有完成绕过那个异步调用的require而没有在前面设置Deferred。因此,Deferred构造函数必须最初在define语句中加载,因此我不需要在我的函数中异步地要求它。