我有一个服务器端功能,需要登录。如果用户登录成功,函数将返回1。如果不是,该函数将返回登录页面。

我想使用Ajax和jQuery调用该函数。我所做的是提交带有普通链接的请求,并在其上应用了单击功能。如果用户没有登录或函数失败,我希望ajax调用返回true,以便触发href。

但是,当我使用下面的代码时,函数在Ajax调用完成之前退出。

如何将用户优雅地重定向到登录页面?

$(".my_link").click(
    function(){
    $.ajax({
        url: $(this).attr('href'),
        type: 'GET',
        cache: false,
        timeout: 30000,
        error: function(){
            return true;
        },
        success: function(msg){ 
            if (parseFloat(msg)){
                return false;
            } else {
                return true;
            }
        }
    });
});

当前回答

因为我在这里没有看到它,所以我想我也要指出jQuery when语句在这个目的中非常有用。

他们的例子如下:

$.when( $.ajax( "test.aspx" ) ).then(function( data, textStatus, jqXHR ) {
  alert( jqXHR.status ); // Alerts 200
});

“then”部分直到“when”部分结束才执行。

其他回答

我认为,如果您将成功函数编码为加载适当的页面,而不是返回true或false,事情就会更容易。

例如,你可以这样做,而不是返回true:

window.location="appropriate page";

这样,当成功函数被调用时,页面被重定向。

底层的XMLHttpRequest对象(由jQuery用于发出请求)支持 异步属性。设置为false。就像

async: false

因为async ajax是不赞成的,尝试使用带有承诺的嵌套async函数。可能有语法错误。


async function fetch_my_data(_url, _dat) {

   async function promised_fetch(_url, _dat) {

      return new Promise((resolve, reject) => {
         $.ajax({
            url:  _url,
            data: _dat,
            type: 'POST',
            success: (response) => {
               resolve(JSON.parse(response));
            },
            error: (response) => {
               reject(response);
            }
         });
      });
   }

   var _data = await promised_fetch(_url, _dat);
   
   return _data;
}

var _my_data = fetch_my_data('server.php', 'get_my_data=1');

我没有使用$。Ajax和$。Post和$。get函数,所以如果我需要等待响应,我使用这个:

$.ajaxSetup({async: false});
$.get("...");

如果你不想让$.ajax()函数立即返回,将async选项设置为false:

$(".my_link").click(
    function(){
    $.ajax({
        url: $(this).attr('href'),
        type: 'GET',
        async: false,
        cache: false,
        timeout: 30000,
        fail: function(){
            return true;
        },
        done: function(msg){ 
            if (parseFloat(msg)){
                return false;
            } else {
                return true;
            }
        }
    });
});

但是,我要指出,这与AJAX的观点是相反的。此外,您应该在fail和done函数中处理响应。只有当从服务器接收到响应时,才会调用这些函数。