Как получить ответ сервера в формате JSON в Sencha Touch?

#javascript #extjs #sencha-touch

#javascript #extjs ( расширение ) #sencha-touch #extjs

Вопрос:

Я создал AJAX-запрос в функции. Однако я не уверен, как вернуть результат JSON — кто-нибудь может показать мне, как это сделать?

 function getData(arg1, arg2, arg3){

    Ext.Ajax.request({
        url: 'getData.php',
        params: {
            arg1: arg1,
            arg2: arg2,
            arg3: arg3
        },
        method: 'POST',
        success: function(response, opts) {
            var jsonData = Ext.util.JSON.decode(response.responseText);
            console.log(jsonData);   <-- Can see the result here!
        },
        failure: function(response, opts) {
            console.log('server-side failure with status code '   response.status);
        }
    });
    return /jsonData/    <-- Here is the value I want?!

}
  

Ответ №1:

Причина, по которой вы jsonData не получите никакой информации, если используете ее в своих getData функциях, заключается в том, что при успешном обратном вызове (помните, что запрос асинхронный) getData область уже закрыта.

Что вы можете и должны сделать, так это определить функцию-обработчик:

 function handleSuccess( response, opts )
{
   var jsonData = Ext.util.JSON.decode(response.responseText);
   // use jsonData here in whatever way you please
}
  

затем определите свой getData вот так:

 function getData(arg1, arg2, arg3){

    Ext.Ajax.request({
        url: 'getData.php',
        params: {
            arg1: arg1,
            arg2: arg2,
            arg3: arg3
        },
        method: 'POST',
        success: handleSuccess,
        failure: handleError
    });
    // Note the lack of return statement.
}
  

Конечно, вы можете сделать то же самое с обработкой ошибок:

 function handleError( response, opts )
{
   console.log('server-side failure with status code '   response.status);
}
  

Обновить

у вас нет возможности сделать что-то подобное (где result вы получите ответ сервера):

 ...
var result = getData('arg1', 'arg2', 'arg3');
...
  

надежно и по-прежнему вызывает запрос AJAX. Если бы вы подумали об этом — если бы вышеупомянутое было возможно, это, по сути, стало бы синхронным запросом.

Есть два способа выполнить ваши вычисления на основе jsonData , который содержит ответ сервера::

1) Сделайте это в handleSuccess функции и соответствующим образом скорректируйте остальную часть вашего кода (как правило, нет — вы можете передать функции обработчика в качестве параметров в Ext.Ajax в options.callback и )

2) Сделайте запрос вашего сервера синхронным (не рекомендуется) обычными средствами

Комментарии:

1. Спасибо за ваш быстрый ответ. И да, я понимаю, что вы имеете в виду, но моя цель — получить значение, возвращенное с сервера, и это значение ‘jsonData’ будет использоваться в другой функции для вычисления. Как я могу это сделать?

2. Спасибо ZenMaster, я действительно ценю ваши объяснения. Есть ли какой-либо шанс выполнить такого рода задачи с помощью хранилища?

3. @user888022 нет, не совсем, поскольку загрузка хранилища также будет асинхронной — разница будет в том, что вам придется либо использовать один из компонентов, которые используют store по умолчанию, либо, если вы хотите манипулировать данными самостоятельно, вам придется привязать какой-либо обработчик к datachanged событию хранилища (или аналогичному) — что, по сути, то же самое, что вы делаете выше. Разница при использовании store заключается в том, что, если ваши данные являются «табличными», вы получаете доступ к встроенному API магазина — сортировке, фильтрации и т.д.