Backbone.js 如何将strophe.plugins与主干和require.js一起使用

Backbone.js 如何将strophe.plugins与主干和require.js一起使用,backbone.js,xmpp,requirejs,strophe,Backbone.js,Xmpp,Requirejs,Strophe,我使用strophe.archive插件,但在strophe发送查询后,延迟对象的done函数似乎“未定义”。我还将插件添加到require.js的“shim”中: var q = $.Deferred(); q = connection.archive.listCollections("user@server.lit"); console.log(q); q.done(function(){ co

我使用strophe.archive插件,但在strophe发送查询后,延迟对象的done函数似乎“未定义”。我还将插件添加到require.js的“shim”中:

        var q = $.Deferred();     
        q = connection.archive.listCollections("user@server.lit");
        console.log(q);
        q.done(function(){
            console.log("DONE");
        });
我得到了以下线索:

Uncaught TypeError: Cannot call method 'done' of undefined test.js:23
Backbone.View.extend.initialize test.js:23
Backbone.View backbone.js:1148
child backbone.js:1393
Backbone.Router.extend.pageTest router.js:92
(anonymous function) backbone.js:900
(anonymous function) backbone.js:1082
_.some._.any underscore.js:193
_.extend.loadUrl backbone.js:1080
_.extend.navigate backbone.js:1125
_.extend.navigate backbone.js:909
Backbone.View.extend.pageTest test1.js:199
jQuery.event.dispatch require-jquery.js:5385
elemData.handle.eventHandle
垫片:

  archive: {
      deps: ["jquery", "strophe"],
      exports: "archive"
  },

调用一个延迟对象并将其分配给
q
,然后将
listCollections
的结果分配给
q
。这是两个不同且完全不相关的作业。仅仅因为您最初延迟了
q
,并不意味着
listCollections
的结果现在在某种程度上是可延迟的

    var q = $.Deferred();  // q is a deferred obj
    q = connection.archive.listCollections("user@server.lit"); // q is undefined
listCollections
必须返回一个延迟对象,才能对其调用
done

查看插件代码,它看起来像是
listCollections
没有返回任何内容

相反,您必须传递一个回调函数:

    var q = $.Deferred();     
    q = connection.archive.listCollections("user@server.lit", null, function(){
        console.log("DONE");
    });
或者,您可以为
listCollections
创建一个包装器函数,该函数将返回一个延迟值

    function deferrableListCollections () {
        var q = $.Deferred();     
        connection.archive.listCollections("user@server.lit", null, function(){
            q.resolve() ;
        });
        return q;
    }
不,您可以调用与原始代码类似的代码:

    q = deferrableListCollections("user@server.lit");
    q.done(function(){
        console.log("DONE");
    });