我正在尝试编写一个jquery插件。
现在,我想在这个插件的一个函数中使用ajax调用。
但是它应该是可链接的,这意味着在这种情况下应该执行ajax调用,并且只有在返回某些内容之后,才会发生返回。
我尝试了不同的东西,但到目前为止我无法做到这一点,以便链中的第二个函数在检索到ajax调用的返回值后真正执行;
在这个版本中(见下文),我可以使用
(文档)$ .createDatabase()消息();
所以,链接工作。 但是查看控制台日志 - 在createDatabase()中的ajax-call完成之前执行message()函数。
我怎样才能这样做
(文档)$ .createDatabase()消息();
首先返回createDatabase()内部的ajax-call的输出/返回,并且只在执行该message()之后?
代码:
(function($) {
$.fn.createDatabase = function(options) {
// Plugin options defaults
var settings = $.extend({
name: 'NA',
onExit: function() {} // callback function
}, options);
$.ajax({
method: "POST",
url: "plugin/php/createDatabase.php",
data: settings
})
.done(function(msg) {
console.log("createDatabase executed with message: " + msg);
settings.onExit.call();
});
return this;
};
$.fn.message = function() {
console.log('this should appear after the console-log message of createDatabase');
return this;
}
}(jQuery));
谢谢!
答案 0 :(得分:0)
你可以做几件事,但这些都是个坏主意。原因是这些是两个独立的jQuery插件 - 一个插件应该能够独立工作。没有保证或理由让某人不能做.message().createDatabase()
。如果您需要保证执行顺序,那么您应该只使用一个插件。一种可能的方法是在呼叫message
时在options
内传递.createDatabase(options)
,然后在呼叫完成后运行message
。像这样
$(document).createDatabase({
message: function() {...}
});
...
var promise = $.ajax({
method: "POST",
url: "plugin/php/createDatabase.php",
data: settings
})
.done(function(msg) {
console.log("createDatabase executed with message: " + msg);
settings.onExit.call();
});
...
if ( settings.message )
promise.done( settings.message.bind(this) );
我尝试了不同的东西,但到目前为止我无法做到这一点,以便链中的第二个函数在检索到ajax调用的返回值后真正执行;
第一个函数在第一个函数完成时执行。第一个用return this
结束,但这是在ajax调用完成之前发生的,因为ajax调用是异步的。