2012-10-04 35 views
2

我使用strophe.archive插件,但在Strophe發送查詢後,Deferred對象的done函數似乎是「未定義的」。我還增加了插件的require.js的 「墊片」:如何使用strophe.plugins with backbone和require.js

 var q = $.Deferred();  
     q = connection.archive.listCollections("[email protected]"); 
     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" 
    }, 

回答

1

你調用一個延遲和OBJ將其分配給q,然後將listCollections的結果分配給q。這是兩個不同的完全不相關的任務。僅僅因爲你製作了q最初並不意味着listCollections的結果現在以某種方式deferrable

var q = $.Deferred(); // q is a deferred obj 
    q = connection.archive.listCollections("[email protected]"); // q is undefined 

listCollections必須返回延期對象讓你能夠調用done就可以了。

看着插件代碼,它看起來像listCollections不會返回任何東西。

相反,你必須通過listCollections一個回調函數:

var q = $.Deferred();  
    q = connection.archive.listCollections("[email protected]", null, function(){ 
     console.log("DONE"); 
    }); 

或者,你可以做一個包裝函數爲listCollections,將返回一個推遲。

function deferrableListCollections() { 
     var q = $.Deferred();  
     connection.archive.listCollections("[email protected]", null, function(){ 
      q.resolve() ; 
     }); 
     return q; 
    } 

不,你可以打電話類似於原來的代碼的東西:

q = deferrableListCollections("[email protected]"); 
    q.done(function(){ 
     console.log("DONE"); 
    }); 
+0

偉大的答案!非常感謝! – genericatz

+0

謝謝,很高興我能幫到你。 –

相關問題