仍有问题通过function回归价值

我遇到以下function的严重问题:

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. } }); } 

除了未定义的值之外,几乎没有任何东西出现的接缝,并且调试器中没有显示错误。 我真的差点把我的笔记本电脑扔在墙上。 如果有人可以帮我这样做,请回答! 提前致谢。

第一关: 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; } 

问题是,由于Ajax调用将在未来的任意时间完成,因此您不能简单地从其success处理程序返回一个值。

一个问题是你实际上并没有对服务器返回的data做任何事情,这看起来令人费解。

简言之,您需要将function作为success回调的一部分来实现。 这可以在线完成,或者您可以在Ajax调用本身之外创建回调函数,并将其用作success属性的值:

 function onSuccess(data) { // Do something with the data here } ... $.ajax({ // etc. success: onSuccess }; 

您也可以使用jQuery的$ .when函数 。

问题是您尝试从中返回关键字的范围。 成功函数由jQuery调用,并且您无法控制jQuery对该返回值执行的操作。 你可以return $.ajax(...但你不会得到你所期望的,因为根据文档:“从jQuery 1.5开始,$ .ajax()方法返回jqXHR对象,它是一个超集XMLHTTPRequest对象“(http://api.jquery.com/Types/#jqXHR)。

你应该做的是设置一个回调函数,如:

 function doSomethingWithKeywords(keywords) { // do stuff }; 

并在成功函数中调用该函数:

 doSomethingWithKeywords(keywords); 

编辑: Hogan是一个很好的解决方案,因为你的调用不是异步的。

你遇到的问题是你传递的回报不是函数的返回 – 它是成功事件的回归。 通常,闭包(暗示将局部变量传递给函数)用于解决JavaScript中的这个问题。

NB我仍然认为你的function不起作用,因为我没有看到search_return["keywords"]的定义。 但至少你不必担心关闭问题。 一旦您的成功function正确,主要function将返回它。

像这样:

 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; }