我遇到以下功能的严重问题:
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.
}
});
}
除了未定义的值之外,没有任何内容的接缝,并且调试器中没有显示错误。 我真的差点把我的笔记本电脑扔在墙上。 如果有人可以帮我这样做,请回答! 提前谢谢。
答案 0 :(得分:2)
第一关: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;
}
答案 1 :(得分:1)
问题在于您尝试从中返回关键字的范围。成功函数由jQuery调用,并且您无法控制jQuery对该返回值执行的操作。你可以做return $.ajax(...
但是你不会得到你期望的,因为根据文档:“从jQuery 1.5开始,$ .ajax()方法返回jqXHR对象,它是XMLHTTPRequest对象的超集“(http://api.jquery.com/Types/#jqXHR)。
你应该做的是设置一个回调函数,如:
function doSomethingWithKeywords(keywords) {
// do stuff
};
并在成功函数中调用该函数:
doSomethingWithKeywords(keywords);
编辑: Hogan是一个很好的解决方案,因为你的电话不是异步的。
答案 2 :(得分:1)
问题在于,由于Ajax调用将在未来的任意时间完成,因此您不能简单地从其success
处理程序返回值。
一个问题是你实际上并没有对服务器返回的data
做任何事情,这似乎令人费解。
简言之,您需要在success
回调中实现该功能。这可以在线完成,或者您可以在Ajax调用本身之外创建回调函数,并将其用作success
属性的值:
function onSuccess(data) {
// Do something with the data here
}
...
$.ajax({ // etc.
success: onSuccess
};
您也可以使用jQuery's $.when function。
答案 3 :(得分:0)
你遇到的问题是你传递的回报不是函数的回归 - 它是成功事件的回归。通常,闭包(暗示将局部变量传递给函数)用于解决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;
}