【问题标题】:ajax post request failing after third times on iOSajax 发布请求在 iOS 上第三次后失败
【发布时间】:2021-05-06 05:28:37
【问题描述】:

我有一个 Node.js express 应用程序。

在特定的视图中,我有一个经常性的 ajax post-call,它正在检查进程的状态。 在响应上,如果需要再次检查,则在再次检查之前有 5 秒的超时时间。

在桌面和移动设备上运行良好 none IOS 但是,一旦我在 iOS 手机上尝试它,它就在第三个请求中失败了。 (前两个效果很好)

我在 iPhone 上检查了不同的浏览器,每次都是一样的。

我收到以下电话回复

{"readyState": 0, "status":0, "statusText": "error"}

似乎每个 iOS 设备都是如此。但它在其他任何地方都有效(android、windows) 有什么想法可以从哪里来? 非常奇怪的是,前两个调用运行良好,然后以某种方式被阻止。

请求的JS代码 :

const checkUpdate =  (amount, ref, status) => {
        $.post({
            type: "POST",
            url: "/check-update-transaction",
            data: { amount, ref, status},
            headers: {
                "CSRF-Token": token,
            },
        }).done(
            (res) => {
                console.log(JSON.stringify(res));
                setTimeout(() => {
                    switch (parseInt(res.status))   {

                        case 1:
                            
                            return checkUpdate(amount, ref, 1);
                        case 2:
                            
                            return checkUpdate(amount, ref, 2);
                        case 3:
                            
                            $("#circle-loader-popup").hide();
                            return true;
                            
                    }

                }, 5000);

            }
        ).fail((error) => {
            $(".status-information .main-content-loader")
                .html(`A problem happened during the submission please try again `);
            console.log(JSON.stringify(error));
            if(error.responseJSON && error.responseJSON.notFind === true){
                $("#after-first-step").hide();
            }
        });
    };

提前致谢,

安塞尔

【问题讨论】:

  • 该响应意味着 AJAX 调用尚未发送,因为试图发送它的 JS 中存在错误。如果没有看到您的 JS 代码,我们真的无法提供更多帮助
  • @RoryMcCrossan 谢谢,我看到请求没有被发送。不幸的是,日志中没有其他错误。另外,请记住,这仅在 iOS 上发生..所有其他 platorms 和 android 都在工作..我怀疑当请求太近时来自 iOS 的网络阻塞,但我不确定
  • 有一个现场工作的例子会很方便。你能用一些console.logs做一个测试页面吗?
  • 您实际上可以现场观看。 playground.cardano-native-token.com 用测试数据填写表格之一。当您确认提交时,您会看到它正在工作。该问题发生在 iOS iPhone 上。不在其余部分。
  • 我检查过,但无法重现该问题。如果您问我,您的客户端代码没有任何问题。回复{"readyState": 0, "status":0, "statusText": "error"}的是服务端,能发下服务端的代码吗?

标签: jquery ios ajax express mobile


【解决方案1】:

由于似乎有些混乱,请阅读您的 cmets 到您的问题,我认为用这个答案消除混乱会很方便。

你的问题的问题是,这个响应与ajax请求无关:

{"readyState": 0, "status":0, "statusText": "error"}

您在这里看到readyState,巧合的是,它也是XMLHTTPRequest 对象的一个​​属性。

那么,jQuery post 方法是如何工作的,XMLHTTPRequest 是从哪里来的?

嗯,jQuery 有自己的XMLHTTPRequest 对象实现:jQuery XHR 对象或jqXHR。这是同一个对象,但具有一些附加功能。它具有类似 Promise 的功能。

post 方法实际上返回一个jqXHR 对象:

var thejqXHR = $.post(url);
console.log(thejqXHR.readyState); //1

这里的readyState1open() has been called.,因为post 立即在jqXHR 对象上调用open。换句话说:它永远不会是0,因为它是立即打开的。

由于jqXHR 对象的作用类似于承诺,因此我们可以执行done

var thejqXHR = $.post(url);
thejqXHR.done(function(data, textStatus, jqXHR){
    console.log(data); //the data returned by the server
    console.log(textStatus); // always 'success'
    console.log(jqXHR.readyState);// always 4
});

成功时调用jqXHR 对象的done 方法。含义请求成功:url有效,请求到达服务器,服务器发送有效响应,其中data传递给done方法。而XHR.readySate 是 4:The operation is complete.

如果出现问题,则不会调用 done 方法。承诺被拒绝,所以fail 方法被调用。

thejqXHR.fail(function(jqXHR, textStatus, errorThrown){
    console.log(jqXHR.readyState); // always '4'
    console.log(textStatus); // always 'error'
    console.log(errorThrown); // for example 'Not Found'
});

在这里,您再次看到readyState4The operation is complete,请求已发送,但由于某种原因它没有解析,调用fail 方法并且操作完成(但是有错误)。 errorThrown 是您需要调查以找出我们的问题所在。

总结一下:XHR.readyState 在使用 jQuery 的 post 方法时毫无用处。请求刚开始时为1 (opened),或者请求完成时为“4”(成功或失败)。

所以,回到你的行:

{"readyState": 0, "status":0, "statusText": "error"}

这与XMLHTTPRequest.readyState 无关。当请求完成时,XMLHTTPRequest.readyState4。您在这里处理的是来自服务器的成功响应。服务器发回并传递给成功(done)函数的是data。换句话说,请求进行得很顺利。找到服务器的地址,服务器返回一个有效的响应并传回给你。

现在,我不知道为什么服务器会成功响应上述行。这完全取决于生成此行的服务器端代码。您在问题中发布的代码与它无关。您应该调查的是服务器端代码,并找出为什么它会返回带有readyState: 0 的字符串。

希望现在清楚一点...

【讨论】:

  • 非常感谢 Klaasiek 抽出宝贵时间。好吧,确实似乎其他一些人在互联网上搜索类似的问题让我感到困惑。所以感谢您的澄清。真正的问题是发布服务器代码不会有效率,因为它很重。第二个问题是故障排除,错误随机出现并且仅在 iOS 上(我只有在我的手机上才有)。所以调试起来真的很困难。无论如何,我会看看如何进一步调查以收集更多信息。无论如何,如果没有新的东西出现,我会给你赏金!再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 2021-03-20
  • 2017-05-20
  • 1970-01-01
相关资源
最近更新 更多