2

我使用了 strophe.archive 插件,但在 Strophe 发送查询后,延迟对象的完成功能似乎是“未定义的”。我还将插件添加到 require.js 的“垫片”中:

        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"
  },
4

1 回答 1

1

您调用延迟的 obj 并将其分配给q,然后将结果分配listCollectionsq。这是两个不同且完全不相关的任务。仅仅因为你q最初做了一个 deferred 并不意味着结果 fromlistCollections现在是某种方式deferrable

    var q = $.Deferred();  // q is a deferred obj
    q = connection.archive.listCollections("user@server.lit"); // q is undefined

listCollections必须返回一个延迟对象才能调用done它。

查看插件代码,它似乎listCollections没有返回任何内容。

相反,您必须传递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");
    });
于 2012-10-30T06:20:59.577 回答