1

最近、XHRを使用するときに同期動作を使用することを想定していないと聞きました。私の場合、同期動作が必要です。現在の方法ではなく、サービスへの呼び出しを同期的に書き換える最良の方法は何ですか。jqueryを使用しないでください..

   var xhReq = new XMLHttpRequest();
    xhReq.open("POST", "ClientService.svc/REST/TestHtmlSend", false);
    xhReq.send(null);
    var serverResponse = JSON.parse(xhReq.responseText);

    return serverResponse;
4

2 に答える 2

4

「同期動作」は必要ありません。代わりに、あなた (開発者) は、JavaScript の非同期の性質、特に匿名コールバックの使用方法とクロージャの処理方法について頭を悩ませる必要があります。

たとえば、これを行っている場合:

function doSomething(arg) {
    var number = arg + 10; // for example
    var data = getDetail();
    data = JSON.parse(data);
    element.innerHTML = number + ': ' + data.name;
}

function getDetail() {
    var xhReq = new XMLHttpRequest();
    xhReq.open("POST", "ClientService.svc/REST/GetDetail", false); // bad!
    xhReq.send(null);
    return xhReq.responseText;
}

非同期的に書くことができます:

function doSomething(arg) {
    var number = arg + 10;
    getDetail(function(data) {
        data = JSON.parse(data);
        element.innerHTML = number + ': ' + data.name;
    });
}

function getDetail(cb) {
    var xhReq = new XMLHttpRequest();
    xhReq.open("POST", "ClientService.svc/REST/GetDetail", true);
    xhReq.onreadystatechange = function() {
        if (xhReq.readyState == 4) cb(xhReq.responseText);
    }
    xhReq.send(null);
}

非同期の例では、内部のコールバック関数 (ネットワーク リクエストが完了した後にのみ実行される) がまだ外部関数のnumber変数にアクセスできることに注意してください。これは、JavaScript が静的スコープを持っているためです。つまり、関数を宣言すると、その関数は、その関数を囲む関数の変数に永続的にアクセスできます。

于 2012-10-01T20:29:25.570 に答える
1

通常は次のようになります。

var xhReq = new XMLHttpRequest();
xhrReq.onreadystatechange = function() {
  if (this.readyState != 4) return;
  if (this.status != 200) ...process error...

  var serverResponse = JSON.parse(xhReq.responseText);
  ... process the response ...
}    
xhReq.open("POST", "ClientService.svc/REST/TestHtmlSend", true);
xhReq.send(null);
于 2012-10-01T20:26:37.610 に答える