Backbone.js 如何将strophe.plugins与主干和require.js一起使用
我使用strophe.archive插件,但在strophe发送查询后,延迟对象的done函数似乎“未定义”。我还将插件添加到require.js的“shim”中: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
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");
});