2

strophe.archive プラグインを使用していますが、Strophe がクエリを送信した後、Deferred オブジェクトの 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"
  },
4

1 に答える 1

1

遅延 obj を呼び出して にq割り当て、その結果を に割り当てlistCollectionsますq。これらは 2 つの異なる割り当てであり、まったく関係がありません。q最初に deferredを作成したからといって、結果listCollectionsが何らかの形であるとは限りません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 に答える