Ajax синхронные обратные вызовы - PullRequest
3 голосов
/ 10 марта 2009

У меня есть pageTest.html в локальной папке, эта страница вызывает service.ashx? I = ... (это возвращаемое значение параметра передается с шагом +1) с последующим кодом Ajax:

.
.
getIncr: function(parameters, success){
       $.ajax({
               async: false, 
               type: methodType,
               url: getTarget,
               data: "n="+parameters,
               dataType:"jsonp",
               success: success
             });
    }
.
.

html-страница вызывает эту функцию в течение m раз (со скриптом ..):

  .    
  var start = function(){
  .
  .
  var val = 0;
  .      
  .
  for(i=0; i<m; i++)
  {
      Foo.getIncr(val, function(returned_n){
          val = returned_n;
      });

  }

};

Во время загрузки страницы вызовы выполняются в «Асинхронном режиме», но я устанавливаю « async: false » в Ajax. Я прочитал об этой проблеме и нашел причину, что Ajax не может синхронизировать вызов из page.html в service.ashx, если они находятся в другом домене. Есть ли решение для выполнения вызова синхронизации в page.html к этому service.ashx (в другом домене)?

Ответы [ 2 ]

6 голосов
/ 16 марта 2009

Ну, проблема в том, что вы не можете делать синхронные запросы JSONP. Способ, которым он реализован, заключается в том, как Энди указал, с помощью так называемого «взлома тега сценария». JQuery не может остановить выполнение приложения javascript во время ожидания заполнения тега сценария.

Таким образом, вы вызываете правильный метод jQuery для выполнения запроса JSONP, но, поскольку это JSONP, асинхронный параметр не применяется, и его невозможно обойти. Вы должны обрабатывать запрос асинхронно.

Кстати, в любом случае не рекомендуется использовать $ .ajax в синхронном режиме. Если для выполнения запроса требуется слишком много времени, браузер остановится и, скорее всего, у вашего пользователя появится всплывающее окно с сообщением, что страница не отвечает.

1 голос
/ 10 марта 2009

Вы не можете использовать кросс-домен XMLHttpRequest вообще. Неважно, синхронный он или асинхронный.

Поскольку вы, похоже, используете JSON (и jsonp), вы сможете достичь желаемого с помощью хака тега script. Я полагаю, что в jQuery встроено это (кстати, вы используете jQuery?):

http://docs.jquery.com/Release:jQuery_1.2/Ajax#Cross-Domain_getJSON_.28using_JSONP.29

...