【问题标题】:How to call a function before $.post() callback displays alert()?如何在 $.post() 回调显示 alert() 之前调用函数?
【发布时间】:2013-05-15 10:03:11
【问题描述】:

我会注意,这段代码不是我自己构建的,我只是使用系统上已经存在的插件进行一些 UI 更改。

我正在构建一个使用 blockUI 的插件(是的,我需要使用插件构建一个插件)以便在触发 Ajax 调用时在某些元素上显示加载图标,但是这个特别调用如果success() 事件没有得到所需的响应,则为alert()

结果是我的加载图标调用fadeOut() alert 触发后,这不是我想要的。

当我调用我正在构建的函数时,我传入 $.post() 并完成我需要的设置和选项,如下所示:

$.fn.startLoading({            
    element: $("div"),
    ajax: $.post('some.url',
    {
        //Ajax settings...
    }, function (response) {   //This is the success function, right?
            if (good) {
                //stuff
            }
            else
                alert("Bad!"); //This happens BEFORE fadeOut()
        }
    }, 'text')
    .error(function (msg) {
        alert('Worse error!');
    })
});

我的插件的函数将所有这些作为一个options 参数,如下所示:

$.fn.startLoading = function (options) { ...

然后我像这样访问$.post() 调用:

if (options.ajax)
    ajax = options.ajax;

这就是我卡住的地方。我需要确保fadeOut() 发生在success 事件被触发之前。如何使用我在插件中创建的 ajax 变量来做到这一点?

【问题讨论】:

  • 这里的语法错误:ajax: $.post('some.url'),{ 应该删除 )
  • 另外,jqXHR.error 已被贬值,您应该改用 .fail。
  • 我不认为有办法做你想做的事情,因为你无法控制从插件内部发送 ajax 请求的时间。您要么需要延迟发送 ajax 请求,要么在淡出完成之前在成功中不执行任何操作,这两者都有些脱离上下文。
  • 我会修改插件以改为接受执行 ajax 请求的函数,以便插件可以决定何时发送 ajax 请求,或者让插件接受您然后在内部修改的 ajax 选项插件,并再次控制何时发送。
  • 对,但是由于您无法控制添加成功回调的顺序,并且您无法控制发送请求的时间,因此您无法延迟成功的发生,除非您直接在成功回调中执行此操作。

标签: javascript jquery ajax blockui


【解决方案1】:

一种简单的方法是使用 ajaxComplete、ajaxSuccess 等 http://api.jquery.com/category/ajax/

这些是全局 ajax 处理程序,可以抓取通过 jQuery 发送的所有 ajax 请求...因此您可以在其中设置一个处理程序并将您自己的回调元素等列入白名单,这样您就可以忽略不关心的那些。

在我的测试中,这些全局处理程序在特定 ajax 调用的处理程序之前触发。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    相关资源
    最近更新 更多