【问题标题】:how do I access the return value of this ajax request?如何访问此 ajax 请求的返回值?
【发布时间】:2023-03-14 04:22:01
【问题描述】:

我有这个代码

var stats =  {
    GetMetaData : function() {
        var url = 'http://www.bungie.net/api/reach/reachapijson.svc/game/metadata/'+storage.get('apikey');
        $.ajax({
            url: url,
            success: function(data) {
                return data;
            }
        });
        return 'abc';
    }
}

我使用stats.GetMetaData();调用函数

我希望返回的值是来自 ajax 请求的 data 变量。 但它是字符串'abc' 为什么会这样?

如何返回data 变量?

我尝试过return $.ajax({,但这只是返回函数代码。

【问题讨论】:

    标签: javascript jquery ajax namespaces


    【解决方案1】:

    因为 jquery ajax 请求默认是异步的。您可以使用async: false 选项或(更好)使用回调函数使请求同步。
    此外,正如 CharlesLeaf 所述,使用同步请求将锁定浏览器,直到收到响应为止。

    About the whole concept of asynchronous operations.
    我会从 jquery 站点链接一些解释,但现在似乎已关闭。

    【讨论】:

    • 对您的好答案的小补充;同步请求将锁定您的浏览器,直到完成。对用户体验没有帮助;)
    • 在这种情况下,在请求完成之前实际上不允许发生任何事情,因为整个扩展需要数据(它包含图像 URL 等)。所以强制它同步很有用。
    • 另外,我将如何处理回调函数,因为该函数将在各处使用以获取数据,并且它是所需的响应对象。 (我知道有人会说缓存它,我就是,但是有几个这样的功能。)
    • @Hailwood:强制同步在浏览器脚本中从来没有用处(假设很少)。如果您的服务器需要 2 秒响应,则 Web 界面将冻结 2 秒。请记住,JavaScript 与页面呈现共享同一个线程。阻塞(同步)操作,如长 while 循环会冻结浏览器。
    • @Hailwood - 强制同步很有用,缺点是如果请求永远不会完成,浏览器将保持锁定状态。
    【解决方案2】:
    var stats =  {
        GetMetaData : function() {
            var url = 'http://www.bungie.net/api/reach/reachapijson.svc/game/metadata/'+storage.get('apikey');
            var result;
            $.ajax({
                url: url,
                async: false,
                success: function(data) {
                    result = data;
                }
            });
    
            return result;
        }
    }
    

    【讨论】:

      【解决方案3】:

      由于以下原因,您将无法处理从 success 回调返回的返回值:

      • 首先,您的return data 语句从success 回调返回,而不是从外部GetMetaData 函数返回。

      • 但是另外,当你的success回调被调用时,GetMetaData函数已经返回了。请记住,$.ajax() 默认情况下是异步的(非阻塞的)。异步是AJAX中的A

      您应该直接在回调中处理响应data,或者调用辅助函数来处理响应。由于函数是 JavaScript 中的一等公民,因此您可以将此“辅助函数”作为参数传递给您的 GetMetaData 函数,如 @Guffa suggested in the other answer

      【讨论】:

        【解决方案4】:

        AJAX调用是异步的,即调用立即返回,数据到达时调用回调函数。由于您的 GetMetaData 方法已经完成,回调返回的值将被忽略。

        您可以使调用同步,但如果可能的话,您应该避免这种情况,因为它会冻结浏览器直到响应到达。通常的方法是使用回调函数。

        为方法添加回调:

        var stats =  {
          GetMetaData : function(callback) {
            var url = 'http://www.bungie.net/api/reach/reachapijson.svc/game/metadata/'+storage.get('apikey');
            $.ajax({
                url: url,
                success: callback
            });
          }
        }
        

        调用它使用:

        stats.GetMetaData(function(data){
          // do something with the data
        });
        

        【讨论】:

          【解决方案5】:

          由于请求将是异步的,因此访问数据的方式是通过回调函数,在本例中是分配给success 属性的函数。您可以使请求同步,但这是一个阻塞调用,我不建议这样做,因为在请求返回之前浏览器会被锁定。

          【讨论】:

            【解决方案6】:

            在您的成功函数中调用您拥有的将处理数据的 javascript 函数,即:

                    success: function(data) {
                        DoSomthingWithThe(data);
                    }
            
                    ...
            
                function DoSomethingWithThe(data) {
                   // Do something useful
                }
            

            您的问题是 AJAX 调用是异步的,因此直到您的 GetMetaData 函数退出一段时间后,远程服务器返回数据时才会调用“成功”。您可以选择同步并等待响应,但最好使用上述回调函数。

            【讨论】:

              猜你喜欢
              • 2021-07-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-02-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多