gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:32:51 25 4
gpt4 key购买 nike

场景如下:

我需要通过 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com