Javascript 仍然存在通过函数返回值的问题

Javascript 仍然存在通过函数返回值的问题,javascript,jquery,ajax,function,Javascript,Jquery,Ajax,Function,我对以下功能有严重问题: function requestUploadedSearch() { var cookie = JSON.parse(readCookie("user_search_cookie")); $.ajax({ dataType: "script", async: false, data: { context: "search

我对以下功能有严重问题:

    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.
            }
        });
    }
这意味着除了未定义的值之外,函数中没有任何内容,调试器中也不会显示任何错误。 我真的差点把我的笔记本电脑扔到墙上。 如果有人能帮我做这件事,请回答!
提前感谢。

您遇到的问题是,您传递的返回不是函数的返回,而是成功事件的返回。在JavaScript中,通常使用闭包(隐含地将局部变量传递给函数)来解决这个问题

NB我仍然不认为您的函数会起作用,因为我看不到
search\u return[“关键字”]
是在哪里定义的。但至少你不必担心关闭问题。一旦成功函数正确,主函数将返回它

像这样:

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

您遇到的问题是,您传递的返回不是函数的返回,而是成功事件的返回。在JavaScript中,通常使用闭包(隐含地将局部变量传递给函数)来解决这个问题

NB我仍然不认为您的函数会起作用,因为我看不到
search\u return[“关键字”]
是在哪里定义的。但至少你不必担心关闭问题。一旦成功函数正确,主函数将返回它

像这样:

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

第一关:搜索返回的
变量在哪里?为什么要忽略数据

我觉得这就是你想要做的:

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

第一关:搜索返回的
变量在哪里?为什么要忽略数据

我觉得这就是你想要做的:

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

问题是您试图从中返回关键字的范围。success函数由jQuery调用,您无法控制jQuery如何处理该返回值。您可以
返回$.ajax(…
),但无法得到预期的结果,因为根据文档:“从jQuery 1.5开始,$.ajax()方法返回jqXHR对象,它是XMLHTTPRequest对象的超集”(http://api.jquery.com/Types/#jqXHR)

您应该改为设置一个回调函数,如:

function doSomethingWithKeywords(keywords) {
    // do stuff
};
在success函数中调用该函数:

doSomethingWithKeywords(keywords);

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

问题在于您试图从中返回关键字的范围。成功函数由jQuery调用,您无法控制jQuery使用该返回值做什么。您可以执行
返回$.ajax(…
但您不会得到预期的结果,因为根据文档:“从jQuery 1.5开始,$.ajax()方法返回jqXHR对象,它是XMLHTTPRequest对象的超集”(http://api.jquery.com/Types/#jqXHR)

您应该改为设置一个回调函数,如:

function doSomethingWithKeywords(keywords) {
    // do stuff
};
在success函数中调用该函数:

doSomethingWithKeywords(keywords);

EDIT:Hogan's是一个很好的解决方案,因为您的调用不是异步的。

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

一个问题是,您实际上没有对服务器返回的
数据执行任何操作,这似乎令人费解

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

function onSuccess(data) {
    // Do something with the data here
}

...

$.ajax({ // etc.
    success: onSuccess
};

您也可以使用。

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

一个问题是,您实际上没有对服务器返回的
数据执行任何操作,这似乎令人费解

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

function onSuccess(data) {
    // Do something with the data here
}

...

$.ajax({ // etc.
    success: onSuccess
};

您也可以使用。

您遇到了什么严重或其他问题?您是否使用JavaScript控制台来识别问题,是否报告了任何错误?此代码试图完成什么?什么不适合您?可能重复。重复是关于异步调用的,但基本问题是相同的:您我们从匿名函数返回,而不是从主函数返回。我们需要知道您遇到了什么问题。例如,在您的
success
函数中,我看到您正在使用值
search\u return
,但是您将
数据
传递到函数中,并且不使用它。很抱歉,我保证我会编辑它。问题是m是:这个该死的函数什么都没有出来,什么都没有报告!一个未定义的结果只是出现在最后。你有什么问题,严重的还是其他的?你有没有使用JavaScript控制台来识别问题,有没有报告任何错误?这段代码试图完成什么。什么对你不起作用?可能重复的。duplicate是关于异步调用的,但基本问题是相同的:您是从匿名函数返回的,而不是从主函数返回的。我们需要知道您遇到了什么问题。例如,在
success
函数中,我看到您使用的是
search\u return
,但您将
数据
传递到fu中N操作,不要使用它。很抱歉,我保证我会编辑它。问题是:这个该死的函数没有输出任何内容,也没有报告任何内容!未定义的内容只会出现在末尾。
search\u return[“keyw