1

同期リクエストを使用するのは良い考えではないことはわかっていますが、これが本当に必要な場合です。

getEndDate応答の長さが 20 未満の場合、関数呼び出しを自分自身にしようとしましたが、最初の失敗した要求の後 (URL の応答が短すぎる場合) に進みalert(enddate.EDDAYOW);、エラーが発生し、getEndDate500 ミリ秒ごとに要求を送信し続けます。

getEndDate有効な応答を取得して有効なオブジェクトを返すまでリクエストを送信し続ける関数が必要です。その後、JS の次の行に進みます。それを達成する方法は?

var url = 'http://local.com/cgi-bin/hello2.pl';
// url returns a plain text:
// 1234567890 2013 05 May Friday 13 23 45 01


var enddate = getEndDate(url);

alert(enddate.EDDAYOW);

function getEndDate(url) {
    var xmlhttp = getXmlHttp();
    xmlhttp.open('GET', url, false);
    xmlhttp.send();
    if (xmlhttp.status == 200 && xmlhttp.responseText.length > 20) {
        var n = xmlhttp.responseText.split(" ");
        return {
            'edseconds': n[0],
            'EDYEAR': n[1],
            'EDMON': n[2],
            'EDMONNAME': n[3],
            'EDDAYOW': n[4],
            'EDDAY': n[5],
            'EDHOUR': n[6],
            'EDMIN': n[7],
            'EDSEC': n[8]
        };
    } else {
        setTimeout("getEndDate(" + url + ")", 500);
    }
}


function getXmlHttp() {
    var xmlhttp;
    try {
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
        try {
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (E) {
            xmlhttp = false;
        }
    }
    if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
        xmlhttp = new XMLHttpRequest();
    }
    return xmlhttp;
}
4

1 に答える 1

2

これがあなたの要件を満たすかどうかはわかりませんが、次のように書き直します。

var enddate;

getEndDate(url);

function do_rest(returnDate)
{
    enddate = returnDate;
    alert(enddate.EDDAYOW);

    // do more if you need
};


function getEndDate(url) {
    var xmlhttp = getXmlHttp();

    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4) {
            if (xmlhttp.status == 200 && xmlhttp.responseText.length > 20) {
                var n = xmlhttp.responseText.split(" ");
                do_rest({
                    'edseconds': n[0],
                    'EDYEAR': n[1],
                    'EDMON': n[2],
                    'EDMONNAME': n[3],
                    'EDDAYOW': n[4],
                    'EDDAY': n[5],
                    'EDHOUR': n[6],
                    'EDMIN': n[7],
                    'EDSEC': n[8]
                });
            } else {
                setTimeout("getEndDate(" + url + ")", 500);
            }
        }
    }


    xmlhttp.open('GET', url, false);
    xmlhttp.send();
}
于 2013-05-12T23:59:36.307 に答える