Jquery插件-使ajax调用链

jquery plugin - make ajax call chainable

本文关键字:调用 ajax 插件 Jquery      更新时间:2023-09-26

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

现在,我想在这个插件的一个函数中使用ajax调用。

然而,它应该是可链接的,这意味着在这种情况下,ajax调用应该被执行,只有在返回一些东西之后,才应该发生返回。

我尝试了不同的东西,但到目前为止,我不能使它,所以在链中的第二个函数是真正执行ajax调用的返回值后检索;

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

$(文档).createDatabase () .message ();

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

我怎样才能使它

$(文档).createDatabase () .message ();

首先返回在createDatabase()内部的ajax调用的输出/返回,并且仅在该消息()执行之后?

代码:

(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)时将message传递到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调用是异步的。