Internet Explorer - Chuyện tình chưa có hồi kết của tôi

Tôi có đoạn code như thế này, tưởng chừng như vô hại mà lại nguy hiểm vô cùng !!!


    function executeQuery() {
            $.ajax({
                url: 'https://day_la_cai_url_static',
                method: 'GET',
                success: function (data) {
                    if (data.statusCode >= 0) {
                        window.location.href = data.url;
                    } else {
                        if (retry > 0)
                            setTimeout(executeQuery, 5000); // 5s gọi lên server 1 lần
                        retry--;
                    }
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    console.error("Error throw: ", errorThrown);
                }
            });
        }
        

Chuyện là hôm đó là một ngày đẹp trời đến lạ kỳ, trời xanh trong vắt, cùng vài tiếng chim kêu líu lo. Tôi đến công ty như bao đồng dâm dev khác.
Mọi chuyện sẽ không có gì đáng để nói nếu không có cuộc gọi nhỡ ấy, cuộc gọi định mệnh, ý tôi là tiếng Buzz!!! trên Skype của đối tác report bugs.

  • Họ: Chúng tôi có đang gặp vấn đề với website của bạn trên IE.
  • Tôi: ":) WTF, IE ư. WTF thêm lần nữa. T có làm việc với IE bao giờ đâu" - Ấy là trong đầu tôi nghĩ vậy chứ ko dám ...
  • Mình bị lỗi ở đâu vậy ạ? - Tôi đáp
  • Họ: Lúc redirect sang trang mới đó em.
  • Tôi: Dạ, Để em kiểm tra lại...

2016-01-06-image-6

Welcome to IE

Quá trình debug bắt đầu...

Tôi xài Macbook ở công ty cũng xài MacOS. Lấy đâu ra cái đống Internet Explorer củ nồi đó đây. Vậy là tôi cài nguyên cái máy ảo Virtualbox vào và chọn hẳn cho mình cái HĐH window 7.

Mở IE lên và debugs. Wat the F***. Đấy là tiếng thở dài đầu tiên của tôi. Có cái bugs đéo nào đâu. Mọi thứ vẫn bình thường mà.
Tôi bình tĩnh hỏi lại đối tác:

  • Tôi: Em kiểm tra trên IE, mọi thứ vẫn hoạt động bình thường ạ. Không biết mình sài trên phiên bản nào.
  • Đối tác: Copy cái ảnh: IE 11
  • Tôi: Ơ, em cũng đang sài IE 11 sao không bị nhỉ.
  • Đối tác: ...
  • Tôi: Dạ, để em check lại.

Tôi vẫn không hiểu tại sao, máy tôi được mà đối tác không được.
Vậy là tôi phải nhờ đối tác debugs giùm để check logs server các kiểu mà vẫn ko được.

Thế là tôi down version từ 11 --> 10 tới đây là thôi, tới đây thôi. :)
Tôi phát hiện ra một điều càng đi tới cuối con đường ấy, sản phẩm của tôi càng đi vào bế tắc (ý tôi là cái trình duyệt củ nồi IE í - còn lại vẫn bình thường), chẳng được như câu chuyện tình lãng mạn. Bể css, exception ở đâu văng ra lung tung trên từng dòng của console :(

r_402417_NadPt

Nỗi sợ hãi vẫn luôn thường trực

Tuy vậy tôi mấy thấy đc một chút ánh sáng lé lên, dòng code thực thi ajax ấy ko gọi lên server để lấy dữ liệu về. Mặc dù có logs client là đã execute
Sau một hồi search nát cái StackOverFlow thì tôi mới biết, IE super caching request, nghĩa là nó chỉ execute ajax 1 lần, lưu lại kết quả, những lần request khác thì nó lại lấy kết quả lần đầu. <== WTF.

1f8ed5374c558cafc22dccac9a7a438f

Học theo cái Idol

Và theo lời chỉ bảo của các GOSU thì url phải thay đổi thì mới lấy dữ liệu mới được, và cũng là cách chỉ dạy ấy cần thêm một parameter: &_=' + new Date().getTime() để đảm bảo mỗi lần url request khác.
Bổ sung thêm 1 cái:


cache: false

Chúng ta có đoạn code ntn:


    function executeQuery() {
            $.ajax({
                url: 'https://day_la_cai_url_static&_=' + new Date().getTime() ',
                method: 'GET',
                cache: false,
                success: function (data) {
                    if (data.statusCode >= 0) {
                        window.location.href = data.url;
                    } else {
                        if (retry > 0)
                            setTimeout(executeQuery, 5000);
                        retry--;
                    }
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    console.error("Error throw: ", errorThrown);
                }
            });
        }
        

Kết quả vẫn là chạy tốt trên máy tôi còn đối tác thì KHÔNG.

Tôi down version từ 10 --> 9

Lần này thì có lúc chạy lúc không, oạch một đời quá buồn cho đội bạn.

Tôi lại down xuống 9 --> 8

Lần này thì không còn gì để nói.

Tôi nghĩ là do thằng JQuery, tôi đổ lỗi cho trình duyệt, đổ lỗi cho thằng Microsoft.
Rồi đến thằng StackOverFlow, chửi qua hàng xóm, chửi thẳng thằng bàn bên, chửi tới PM, rồi qua hẳn leader và cả thằng viết ra những dòng code đấy...

Và rồi sau tất cả tôi quyết định thay đổi rất lớn tới cuộc đời tôi, tôi viết lại API. Chuyển từ GET qua POST. Chuyển từ JQuery qua dùng thuần Javascript.

Cách code mà leader tôi chê là "Code kiểu sinh viên vậy luôn hả". Sad, very sad, khoảng tầm 3s sau tôi mới lấy lại được bình tĩnh. Thật ra tôi cũng ko buồn lắm đâu vì tôi lúc ấy cũng chưa ra trường thật, chưa tốt nghiệp, chưa có bằng luôn.

Mấy ổng còn thường hay nói: Code ngu như mấy thằng sinh viên mới trường, mà mình thì còn chưa ra trường nên chẳng lo :xD


function executeXML() {
            var xhttp = new XMLHttpRequest();
            xhttp.onreadystatechange = function () {
                if (this.readyState == 4 && this.status == 200) {
                
                    var data = JSON.parse(xhttp.responseText);
                    if (data.statusCode >= 0) {
                        redirect(data);
                    } else {
                        if (retry > 0)
                            setTimeout(executeXML, 5000);
                        retry--;
                    }
                }
            };
            xhttp.open("POST",
                'https://day_la_cai_url_static_to_dynamic&_=' + new Date().getTime(), true);
            xhttp.send();
        }
        

Tổng kết

  • Không nên đùa với thằng IE, tập sống chung với nó
  • Code: Chuyển từ GET qua POST, dùng ajax thuần
  • Đề nghị: Sếp mua windows xài đỡ mất công mò tool debugs :xD