2

AJAX 呼び出しを生成して応答を返す関数を作成しようとしています。

function msg(message)
{
    send = new XMLHttpRequest();
    send.open("POST", "msghandler.php", false);
    send.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    send.send("msg="+encodeURI(message));
    return send.responseText;
}

ご覧のとおり、現在は同期呼び出しを使用していますが、これは最適な解決策ではありません。サーバー側で問題が発生し、ブラウザがフリーズすることは、デバッグ中に非常によくあることだからです。呼び出しを非同期にし、関数によって応答が返されるようにする方法はありますか?

4

3 に答える 3

3

存在しないものを返品することはできません。ただし、コールバックを永遠にインデントすることを恐れている場合は、promiseオブジェクトを返すことができます。非常に簡単な例を次に示します。

function msg(message) {
    var done = function(){};
    send = new XMLHttpRequest();
    send.open("POST", "msghandler.php", true);
    send.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    send.send("msg="+encodeURI(message));
    send.onreadystatechange = function() {
        if(send.readyState == 4){
            done(send.responseText);
        }
    });
    return {
        ready: function(fn) { done = fn; }
    };
};

msg('foo').ready(function(response) {
    alert(response);
});

多くのフレームワークはすでに遅延オブジェクトを実装しています。

于 2012-08-21T21:03:30.047 に答える
2

ブラウザーの JavaScript エンジン (Web ワーカーは別として) は本質的にシングルスレッドであるため、これは不可能です。関数がサーバーからの応答を返すようにする場合msg()、その関数の呼び出しには少なくとも HTTP 要求が必要とする時間と同じくらいの時間がかかります。さらに、JavaScript エンジンはシングルスレッドであるため、それまでに他のコードを実行することはできません。そのため、ブラウザは同期 HTTP 呼び出し中にフリーズする必要があります。

それを回避することはできず、ライブラリも役に立ちません。それがクッキーが崩れる方法です。ブロッキング コールを使用するか、コールバックを使用します (これは可能だと思います)。

こちらもご覧ください

于 2012-08-21T20:54:57.057 に答える
2

完全に非同期になり、コールバックをパラメーターとして関数に渡します。これが JavaScript の正しい使い方です。次のようにします。

function msg(message, callback)
{
    var xmlhttp;
    if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else
    {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
            // asynchronously call the callback with the result
            callback(xmlhttp.responseText);
        }
    }
    xmlhttp.open("POST", "msghandler.php", true);
    xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xmlhttp.send("msg="+encodeURI(message));
}
于 2012-08-21T20:56:29.823 に答える