У меня есть следующий массив
var arrayOfResults = []; // Results after like statement
Я звоню в базу данных, которая возвращает мне результат json, как показано здесь:
[{
"id": "{fcb42c9c-3617-4048-b2a0-2600775a4c34}",
"pid": "{34214CCB-90C3-4D75-958B-5A1D0FBDD971}",
"ttl": "Easter Bunny",
"img": "/~/media/Images/Recipes/Easter/Filled Pasta/LF_Baked-Spring-Vegetables-Ravioli_920.ashx?h=910\u0026w=910",
"url": "Some url",
"taggedwith": ["{3A54907D-4171-4F4E-8FE8-3A38DA1E874F}", "{6CD78C6B-F435-45EC-BE16-810E80311C23}", "{74528A6F-C40B-4030-A278-A4C9A2F46A47}", "{6DC82B78-61F6-45A0-A63C-EA590BB1057E}", "{E9EF1A41-51D0-403D-9373-37B7A880B251}"],
"articleddate": "2015-05-02",
"tname": "Recipe",
"rbrand": ["{1F6EDA5D-4681-40F0-B455-7C343AC25B72}"]
}, {
"id": "{2e4b04b6-334f-42e9-afd7-ddc4e08417ad}",
"pid": "{C611BAC8-E8E0-4693-920B-93BD5EE2386B}",
"ttl": "Latina Fettuccini \u0026 Summer Sauce with Prawns Recipe",
"img": "/~/media/Images/Recipes/Latina Fresh/Plain Pasta/LF_Fettuccini-Summer-Sauce-Prawns_920.ashx?h=910\u0026w=910",
"url": "Some url",
"taggedwith": ["{3A54907D-4171-4F4E-8FE8-3A38DA1E874F}", "{6CD78C6B-F435-45EC-BE16-810E80311C23}", "{74528A6F-C40B-4030-A278-A4C9A2F46A47}", "{6DC82B78-61F6-45A0-A63C-EA590BB1057E}", "{E9EF1A41-51D0-403D-9373-37B7A880B251}"],
"articleddate": "2015-05-02",
"tname": "Recipe",
"rbrand": ["{1F6EDA5D-4681-40F0-B455-7C343AC25B72}"]
}]
В пользовательском интерфейсе у меня есть текстовое поле, в которое пользователь может ввести произвольный текст.
Я вызываю следующий метод ajax, когда пользователь ввел примерно 5 символов, и я пытаюсь добиться того, чтобы я хотел выполнить оператор like в поле ttl в указанном выше массиве. Если поле ttl совпадает или похоже на freeText, Затем пользователь вошел, и я хочу вставить этот элемент в массив 'arrayOfResuts', однако я вижу обнаруженное предупреждающее сообщение, но он не помещает элемент в новый массив, я знаю это, потому что я оповещаю длину в конце вызов ajax и его 0;
var addItem = false;
var freeText = $('#searchKeywords').val();
$.ajax({
url: 'search?t=&s=DateDesc&type=globalsearch&q=',
type: 'GET',
dataType: 'json',
success: function (searchDataList) {
console.log(searchDataList)
for (var i = 0; i < searchDataList.length; i++) {
addItem = false;
if (freeText.length > 0) { // Filter on free text
if (searchDataList[i].ttl.indexOf(freeText) > -1) { // if title contains free text then we need to add it to the arrayOfResults[].
alert('found');
arrayOfResults.push(searchDataList[i]) // This doesn't seem to work.
addItem = true;
}
}
} // End of for loop
},
error: function (request, error) {
}
});
alert(arrayOfResults.length);
Теперь я не уверен на 100%, что на самом деле идет не так, поэтому любая помощь будет принята с благодарностью.
3 ответа
Ваше оповещение запущено до того, как ваш AJAX-запрос будет выполнен.
Поскольку запрос AJAX является асинхронным, код console.log()
выполняется до вызова успешного завершения, поэтому вы не печатаете нужный результат.
Чтобы напечатать результаты, просто распечатайте в функциях success и error запроса AJAX. Выполнение этой функции в полной функции не поможет, так как она запускается асинхронно от других.
Как уже упоминалось в других ответах, вам нужно обработать данные в блоке успеха. Вы можете сделать это напрямую, как показано ниже, или в более сложных случаях вызвать новую функцию для обработки данных в конце оператора успеха.
Код обновления:
var freeText = $('#searchKeywords').val();
$.ajax({
url: 'search?t=&s=DateDesc&type=globalsearch&q=',
type: 'GET',
dataType: 'json',
success: function (searchDataList) {
console.log(searchDataList);
for (var i = 0; i < searchDataList.length; i++) {
addItem = false;
if (freeText.length > 0) {
if (searchDataList[i].ttl.indexOf(freeText) > -1) {
alert('found');
arrayOfResults.push(searchDataList[i]);
addItem = true;
}
}
} // End of for loop
if (arrayOfResults.length > 1) {
alert(arrayOfResults.length);
console.log(arrayOfResults);
}
},
error: function (request, error) {
}
});
Ваше предупреждение всегда будет 0, потому что AJAX является асинхронным (A в AJAX означает это), и вы вызываете свое предупреждение синхронно.
Что происходит, запрос ajax получает данные, а код синхронизации работает как обычно. Теперь, когда запрос ajax выполняется четко после того, как вы вызвали свое оповещение, он не может регистрировать что-либо, что имеет смысл.
Если вы хотите, чтобы функция вызывалась после выполнения асинхронного запроса, независимо от того, был он успешным или нет, используйте done
: дополнительно к success:
и error:
. Этот код будет запущен после выполнения запроса и покажет вам фактическую длину.
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.