Выполнение следующей строки после завершения кода в Ajax в Jquery - PullRequest
4 голосов
/ 21 июля 2009

Нужна помощь!

Я выполняю вызов ajax внутри функции. Результатом вызова Ajax является возвращаемое значение функции.

Код выглядит следующим образом:

function tabstrip()
 {       
        $.ajax({
                  type: "POST",
                  url: "/WebService/MessageUnratedCount.asmx/GetMessageUnratedCount",
                  data: "{}",
                  contentType: "application/json; charset=utf-8",
                  dataType: "json",
                  success: function(msg) {
                    nUnratedCount=msg.d;               

                  }
              });
           return nUnratedCount;                                       
 }  

Значение nUnratedCount должно быть возвращено после получения его результата от вызова ajax веб-службы. Но вместо этого его возвращают до выполнения вызова ajax. Можете ли вы помочь?

Ответы [ 4 ]

8 голосов
/ 21 июля 2009

Помните, что по умолчанию ваш ajax-запрос не является синхронным вызовом, поэтому функция сразу же вернется без ожидания ответа. Один из вариантов, который я бы настоятельно рекомендовал использовать, - это настройка asynch:false.

Лучшим вариантом является рефакторинг структуры вашего кода и передача обратного вызова, который будет вызван в случае успеха

*

1006 например *

   //calling code
   tabstrip( yourCallbackFunction )

    function tabstrip(callbackFn)
     {       
            $.ajax({
                      type: "POST",
                      url: "/WebService/MessageUnratedCount.asmx/GetMessageUnratedCount",
                      data: "{}",
                      contentType: "application/json; charset=utf-8",
                      dataType: "json",
                      success: callbackFn
                  });                                     
     }

    function yourCallbackFunction (data){
       //do something
    }
0 голосов
/ 21 июля 2009

Ajax-вызовы - это асинхронные вызовы, ваш вызов выполняется, но следующая инструкция интерпретируется без ожидания возврата вызова.

Вам необходимо установить переменную "async" в значение "false", чтобы выполнить синхронный вызов, чтобы код останавливал выполнение при ожидании результата вызова.

http://docs.jquery.com/Ajax/jQuery.ajax#options

Попробуйте добавить это:

function tabstrip()
 {       
        $.ajax({
          async: "false"
        });

        $.ajax({
                  type: "POST",
                  url: "/WebService/MessageUnratedCount.asmx/GetMessageUnratedCount",
                  data: "{}",
                  contentType: "application/json; charset=utf-8",
                  dataType: "json",
                  success: function(msg) {
                    nUnratedCount=msg.d;               

                  }
              });

        $.ajax({
           async: "true"
        });

        return nUnratedCount;                                       
 }
0 голосов
/ 21 июля 2009

Поскольку запрос выполняется в асинхронном режиме (и вы действительно не хотите делать это в синхронном режиме, так как он замораживает браузер на все время выполнения запроса), у вас нет абсолютно никаких способ узнать, когда запрос закончен:

Вы запускаете запрос с

$.ajax({
    ...
});
// "here"

Но запрос выполняется в фоновом режиме и не завершается, когда вы достигаете «здесь».

Чтобы иметь возможность работать с «возвращаемым значением» запроса Ajax, вы должны выполнять всю свою работу внутри функции, включенной в событие success (или complete, или любое другое событие, которое вы хотите).

Вместо того, чтобы просто вставлять msg.d в nUnratedCount, эта функция действительно должна работать с ней (например, отображать ее в HTML-документе или все, что вы хотели сделать с этим фрагментом данных)

0 голосов
/ 21 июля 2009

Я считаю, что вызов ajax является асинхронным по умолчанию. Из jquery документов :

async Boolean По умолчанию: true По умолчанию все запросы отправляются асинхронно (т. Е. По умолчанию установлено значение true). Если вам нужны синхронные запросы, установите для этого параметра значение false. Обратите внимание, что синхронные запросы могут временно блокировать браузер, отключая любые действия, когда запрос активен.

Как отмечает redsquare, вероятно, лучше провести рефакторинг, чем использовать эту опцию. Это зависит от ваших конкретных требований, конечно ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...