jquery插件 - 使ajax调用可链接

时间:2015-07-25 20:48:40

标签: javascript jquery ajax plugins chaining

我正在尝试编写一个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)); 

谢谢!

1 个答案:

答案 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调用是异步的。