У меня серьезные проблемы с функцией ниже:
function requestUploadedSearch()
{
var cookie = JSON.parse(readCookie("user_search_cookie"));
$.ajax({
dataType: "script",
async: false,
data: {
context: "search-get",
code: removeNull(cookie, cookie !== null, "code")
},
success: function(data)
{
var keywords = search_return["keywords"];
return keywords; // here is the damn problem.
}
});
}
Похоже, что из функции просто ничего не выходит, кроме значения undefined, и в отладчике не отображаются ошибки. И я серьезно чуть не швырнул свой ноутбук об стену. Если кто-то может помочь мне сделать это, пожалуйста, ответьте! Заранее спасибо.
4 ответа
1-й выход: где переменная search_return
? Почему вы игнорируете data
?
У меня такое чувство, что это то, что вы хотите сделать:
function requestUploadedSearch()
{
var cookie = JSON.parse(readCookie("user_search_cookie"));
var keywords;
$.ajax({
dataType: "json",
async: false,
data: {
context: "search-get",
code: removeNull(cookie, cookie !== null, "code")
},
success: function(data)
{
keywords = data["keywords"];
}
});
return keywords;
}
dataType: 'script'
, я использую dataType: 'json'
, что радикально меняет способ интерпретации данных, передаваемых в обратный вызов.
Проблема в том, что, поскольку вызов Ajax завершится в произвольное время в будущем, вы не можете просто вернуть значение из его обработчика success
.
Одна проблема заключается в том, что вы на самом деле ничего не делаете с data
, возвращаемым сервером, что кажется озадачивающим.
В двух словах вам нужно реализовать функциональность как часть обратного вызова success
. Это можно сделать в строке, или вы можете создать функцию обратного вызова вне самого вызова Ajax и использовать ее в качестве значения для свойства success
:
function onSuccess(data) {
// Do something with the data here
}
...
$.ajax({ // etc.
success: onSuccess
};
Вы также можете использовать функцию jQuery $.when.
async: true
.
false
. Но это не означает, что возврат значения из обработчика success
возвращает значение из объемлющей функции. Я также предполагаю, что ОП сделал это, пытаясь сделать то, что, по его мнению, он делал, а не потому, что это должно быть или должно быть синхронным.
Проблема заключается в области, из которой вы пытаетесь вернуть свои ключевые слова. Функция успеха вызывается jQuery, и у вас нет никакого контроля над тем, что jQuery делает с этим возвращаемым значением. Вы можете сделать return $.ajax(...
, но вы не получите того, что ожидаете, поскольку, согласно документации: «Начиная с jQuery 1.5, метод $.ajax() возвращает объект jqXHR, который является надмножеством объекта XMLHTTPRequest. " (http://api.jquery.com/Types/#jqXHR).
Вместо этого вы должны настроить функцию обратного вызова, например:
function doSomethingWithKeywords(keywords) {
// do stuff
};
И в функции успеха вызовите эту функцию:
doSomethingWithKeywords(keywords);
EDIT: Hogan - хорошее решение, поскольку ваш вызов не является асинхронным.
Проблема, с которой вы столкнулись, заключается в том, что возврат, который вы передаете, не является возвратом функции - это возврат события успеха. Часто для решения этой проблемы в JavaScript используются замыкания (подразумеваемая передача локальной переменной в функцию).
NB Я все еще не думаю, что ваша функция будет работать, потому что я не вижу, где определяется search_return["keywords"]
. Но, по крайней мере, вам не придется беспокоиться о проблеме закрытия. Как только ваша функция успеха будет правильной, основная функция вернет ее.
Как это:
function requestUploadedSearch()
{
var cookie = JSON.parse(readCookie("user_search_cookie"));
var returnClosure;
$.ajax({
dataType: "script",
async: false,
data: {
context: "search-get",
code: removeNull(cookie, cookie !== null, "code")
},
success: function(data)
{
// returnClosure = data["keywords"];
returnClosure = search_return["keywords"];
}
});
return returnClosure;
}
search_return["keywords"]
выглядит так, как должно быть data["keywords"]
Похожие вопросы
Связанные вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Имейте в виду, что JavaScript — это НЕ то же самое, что Java! Включите все ярлыки, относящиеся к вашему вопросу; например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [svelte] и т. д.
success
вы используете значениеsearch_return
, но вы передаетеdata
в функцию и не используете его.