javascript - 在成功的 AJAX 调用后修改传递给 jQuery done() 回调的参数

标签 javascript jquery ajax promise

场景如下:

我需要通过 AJAX 从服务器(ASP.NET MVC 应用程序 + ServiceStack 服务)获取一些 JSON 数据。如果用户的 session 过期,那么我不会返回 JSON,而是会重定向到登录页面,该页面由 jQuery 自动执行,因此 AJAX 调用的结果最终成为登录表单的原始 HTML。我需要以不同的方式处理这两种情况:

  • 如果结果是 JSON,则使用它通过 .done() promise 更新 UI
  • 如果结果是 HTML,则弹出一个登录对话框。

所以我必须修改传递给 done() 回调的参数。到目前为止,这是我尝试过的:

function getSomeData() 
{
    return $.ajax(
    {
        /* 
            ...set my AJAX config options... 
        */,
        error: function(xhr, status, errorText)
        {
            // handle the error
        },
        success: function(data) 
        {
            // if the AJAX call returned a login form instead of expected JSON 
            // result (because the user's session has expired) then show a 
            // login dialog and resolve the jQuery promise with 'null' instead 
            // of original 'data'

            if (isLoginFormHTML(data)) 
            {
                showModalLoginDialog(data);
                data = null;    // neither this...
                return null;    // ... nor this seem to work!
            }
        }
    });
}

function updateUI()
{
    getSomeData().done(function(jsonData)
    {
        if (jsonData)
        {
            // do something 
        }
    });
}

不幸的是,无论我在 success 函数中执行 data = null 还是 return null,传递给 的参数done() 回调包含从服务器返回的原始 data,如果 session 已过期,它可能是登录表单的 HTML。

所以问题是,我如何告诉 jQuery 将其他内容传递给 done()

P.S. 当然,我可以在 updateUI 方法中执行 isLoginFormHTML() 检查,但我试图避免这样做将数据检索和 UI 更新逻辑分开。

最佳答案

您应该使用 .then 返回您需要的值的 promise , promise 的一个很酷的事情是它们是链式的。

function getSomeData() 
{
    return $.ajax({
        /* 
            ...set my AJAX config options... 
        */,
        error: function(xhr, status, errorText)
        {
            // handle the error
        }).then(function(data){

            if (isLoginFormHTML(data)) {
                showModalLoginDialog(data);
                throw new Error("Unauthorized");..
            }
            return data;
        }
    });
}

这将允许你做:

    getSomeData().done(function(jsonData){
        //yay data   
    }).fail(function(){
       //no data
    });

关于javascript - 在成功的 AJAX 调用后修改传递给 jQuery done() 回调的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23224330/

相关文章:

javascript - if 语句运行在 false 上?

jquery - 使链接一旦被点击就不可点击 - jquery

javascript - AJAX 不使用 Jquery 从 PHP 文件获取数据

jQuery 实时可拖动/实时可放置?

javascript - 注入(inject)javascript点击html按钮

javascript - jQuery 从后退按钮上的数组中删除最后一个元素

javascript - react 如何从 event.currentTarget 获取项目 Prop

jquery - 防止可编辑内容 div 水平增长

javascript - Mysql 根据另一个下拉选项填充下拉列表

ajax - 是否有可能 "multiplex"来自同一页面的许多 AJAX 请求?