如何将同步 ajax 调用替换为凭据以保持应用状态稳定

How can I replace a sync ajax call with credentials to keep my app's state stable

本文关键字:应用 状态 同步 ajax 调用 替换      更新时间:2023-09-26

我知道Firefox和jQuery不允许使用凭据的同步请求。我的问题是我需要知道用户是否已登录(通过点击/echo 端点来检查他在服务器上的会话(。

否则,我的主干

应用程序将进入错误状态,因为当我导航到像 #newActivity 这样的主干路由时,我的控制器中有以下逻辑:

         if (Session.status!=Session.LOGGED_IN) {
            Backbone.history.navigate('login', true);
            return;
        }

会话是一个单一实例对象。在那里,如果我点击异步/echo 端点,直到调用成功时,我的控制器已经认为我们没有登录。结果:当用户刷新页面时,他总是在登录提示中被重定向。

如果我发出请求同步,Chrome 一切正常。

请求是:

 $.ajax({
            url: Config.serverUrl + "/rest/auth/echo",
            type: 'GET',
            dataType: "json",
            async:false,
            xhrFields: {
                withCredentials: true
            },
/*            beforeSend: function(xhr) {
                xhr.withCredentials = true;
            },*/
            crossDomain: true,
            success: function (data) {
                self.bootstrap(data)
                self.globalCh.vent.trigger('loggedIn',data.username);
            }
        });

我有点理解他们为什么要逐步淘汰同步查询,但有时它们是没有不稳定的应用程序状态所必需的。

关于更好的实施的任何解决方法或想法?

你需要

使用承诺和/或延迟对象。http://api.jquery.com/category/deferred-object/

jQuery的AJAX调用返回一个promise。这意味着当 ajax 调用完成时,您可以在任何您想要的位置触发回调。

向 AJAX 请求添加return

function getLoginInformation() {
    return $.ajax({
        // your ajax call to check if the user is logged in or not
    });
}

然后在页面加载时,您在拥有登录信息后触发需要登录信息的内容。喜欢这个:

getLoginInformation().then(function(data) {
    // load the app and everything else that needs credentials
});