#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 магазина — сортировке, фильтрации и т.д.