Сфера javascript / jquery поставила меня в тупик - PullRequest
2 голосов
/ 12 октября 2010

Я обернул обычный вызов ajax в функцию.Он пингует скрипт, возвращает JSON.

Однако, судя по всему, я не могу иметь объект JSON в качестве возвращаемого значения функции.

Должно быть чем-тодовольно просто я скучаю, но из-за моей жизни это не сработает.

function queryCostCenter(user_id, currency_id, country_id){

   var output = null;
   var destinations = new Array();

   var destination = { qty:1, country: country_id };
   destinations.push(destination)           


   var data = {
                 destinations : $.toJSON(destinations),
                 user_id : user_id,
                 currency_id: currency_id
              };

   $.ajax({
         data: data,
         type: 'POST',
         url: '/lib/ajax/ajax_prepaid_cost_calculator.php',
         success: function(data) {         
            output = data;
            alert(output);
         }
   });

   alert(output);

   return json;

}

Функция alert () внутри вызова ajax () отображает объект json, однако, если попытаться сделать предупреждение внефункции и / или вернуть ответ из вызова ajax (), его значение равно нулю?!

Любая помощь / указатели приветствуются.

Ответы [ 4 ]

9 голосов
/ 12 октября 2010

Типичная ошибка.Код после вызова Ajax

alert(output);
return json;

выполняется, до , когда возвращается вызов Ajax.Это асинхронный (это означает, что он не выполняется, когда и где вы помещаете его в код, но в какой-то более поздний момент времени).Вы можете предоставить обратный вызов вашей функции, например:

// cb is our callback - it is a function
function queryCostCenter(user_id, currency_id, country_id, cb){ 
   var destinations = new Array();

   var destination = { qty:1, country: country_id };
   destinations.push(destination)           

   var data = {
                 destinations : $.toJSON(destinations),
                 user_id : user_id,
                 currency_id: currency_id
              };

   $.ajax({
         data: data,
         type: 'POST',
         url: '/lib/ajax/ajax_prepaid_cost_calculator.php',
         success: function(result) { // or just `success: cb`
            cb(result); // execute the callback with the returned data
         }
   });   
}

затем:

queryCostCenter(some_value, some_value, some_value, function(result) {
    // do something with the returned data.
});

Или поместите всю логику в обработчик успеха вызова Ajax.Но с функцией обратного вызова вы более гибки и можете лучше использовать эту функцию.


Это очень распространенный вариант использования обратных вызовов.Поскольку вы не знаете когда вызов Ajax будет завершен, вы передаете функцию вызову Ajax, который должен быть запущен, когда возвращаются некоторые результаты.Вы больше ничего не делаете с обработчиком success: это функция, которая вызывается после завершения вызова.

2 голосов
/ 12 октября 2010

$. Ajax () является асинхронным. Вкратце: предупреждение (выход) за пределами вашего функционального блока, скорее всего, будет вызвано до того, как асинхронный метод вернет какой-либо результат, поэтому он по-прежнему равен нулю.

1 голос
/ 12 октября 2010

Это не вопрос области видимости.Это асинхронный характер вашего вызова Ajax.Ваша функция queryCostCenter, скорее всего, вернется до запуска обработчика Ajax success.Вам нужно запустить всю логику после Ajax в вашем success обратном вызове.

0 голосов
/ 12 октября 2010

вы на самом деле не получаете и не конвертируете обратно в JSON, просто большой текстовый объект.посмотрите документацию по getJSON, которую вам нужно использовать.

http://api.jquery.com/jQuery.getJSON/

$.getJSON({
     '/lib/ajax/ajax_prepaid_cost_calculator.php',
     {data:data}
     , function(data) {   
        alert(data.jsonElement);
        //do something with your data HERE

     }

});

с элементом jsonElement в вашем JSONмассив

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