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 回答