在对象中使用dojo.hitch和闭包,在外部对象的方法中?

时间:2014-06-05 04:21:48

标签: javascript dojo closures

我有一个使用Dojo声明的对象(" ..."行表示我省略了代码,我认为这不是解释问题所必需的):

dojo.provide('communityWidgetClass');

dojo.declare('communityWidgetClass',null,{
    ...

    postToTVService: function(svcType,postJson) {
        try {
            var svcPath;
            switch (svcType) {
            case this.SVC_REL: svcPath=insightConfig.relPath; break;
            case this.SVC_MSG: svcPath=insightConfig.msgPath; break;
            default: return;
            }

            this.consoleLog('communityWidget.postToTVService postJson',postJson);

            this.startLoadingResults();
            var args={
                url:insightConfig.proxyPath+svcPath,
                postData:postJson,
                handleAs:'json',
                preventCache:true,
                load:function(data){
                    dojo.hitch(this,'xhrLoad',data,svcType);
                },
                error:function(error){
                    dojo.hitch(this,'xhrError',error);
                }
            };
            var deferred=dojo.xhrPost(args);
        } catch(err) {
            this.consoleError('communityWidget.postToTVService',err);
        }
    },

    ...

    xhrError: function(error) {
        this.consoleError('xhrError',error);
    },

    xhrLoad: function(data,svcType) {
        this.consoleLog('xhrLoad svc:'+svcType,data);
        this.endLoadingResults();
    }
});

dojo.xhrPost内的postToTVService调用会运行并检索所需的数据。我可以在Firebug" Net"中看到这个请求。标签

问题在于,args.loadargs.error都没有调用他们应该调用的方法 我认为原因是dojo.hitch仅在邮件请求返回后运行,之后应该运行,以便this引用外部communityWidgetClass对象。
但是,如果我之前致电dojo.hitch,则dataerror个对象(我需要传递给xhrLoadxhrError)不存在

我已经看了几个关闭的例子,包括我几个月前为一个更简单的案例写的一个,但是无法弄清楚如何将它们应用到这个案例中。

如何使args.load能够传递data(仅存在于XHR帖子请求的末尾)和svcType(仅在帖子请求之前存在) )communityWidgetClass.xhrLoad方法的参数,与args.error类似,将error参数传递给communityWidgetClass.xhrError

可能更容易没有xhrLoadxhrError方法,只需将他们的身体移到args.loadargs.error内,但这些方法会更大完成后,我认为它们更容易阅读和维护args对象之外的方法。

1 个答案:

答案 0 :(得分:0)

您需要从hitch仍具有预期值的范围中调用this,而不是在已经搞砸了的回调中。

var args={
    …,
    load: dojo.hitch(this, function(data) {
        // in this function, `this` is bound correctly - so we can call
        this.xhrLoad(data, svcType);
    }),
    // alternatively, just "hitch" the method when the arguments match
    error: dojo.hitch(this,'xhrError');
};