jquery 插件 - 使 ajax 调用可链接

jquery plugin - make ajax call chainable

我正在尝试编写一个 jquery 插件。

现在,我想在这个插件的功能之一中使用 ajax-调用。

但是它应该是可链接的,这意味着在这种情况下应该执行 ajax-调用,并且只有在 returned 之后,才会发生 return。

我尝试了不同的方法,但到目前为止我无法做到,因此链中的第二个函数在 ajax 调用的 return 值被检索后真正执行;

在这个版本中(见下文)我可以使用

$(document).createDatabase().message();

所以,链接有效。 但是查看控制台日志——message() 函数在 createDatabase() 中的 ajax 调用完成之前执行。

我怎样才能做到

$(document).createDatabase().message();

首先 returns ajax 调用的 output/return 是在 createDatabase() 内部并且仅在 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)); 

谢谢!

你可以做几件事,但它们都是一个坏主意。原因是它们是两个独立的 jQuery 插件 - 一个插件应该能够独立工作。没有人不做 .message().createDatabase() 的保证或理由。如果您需要保证执行顺序,那么您应该只使用一个插件。一种可能的方法是在调用 .createDatabase(options) 时在 options 中传递 message,然后在调用完成时传递 运行 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) );

I tried different things but so far I could not make it so that the second function in the chain is really executed after the return value of the ajax call was retrieved;

第二个函数在第一个函数完成时执行。第一个以 return this 结束,但这发生在 ajax 调用完成之前,因为 ajax 调用是异步的。