【问题标题】:scope of var in jquery function? [duplicate]jquery函数中var的范围? [复制]
【发布时间】:2012-07-24 22:59:35
【问题描述】:

可能重复:
What does Asynchronous means in Ajax?

为什么我的 var "temp" 在 ajax 之后是 0?

function calc7() {
            var temp = 0;
            $.ajax({
                type: "POST",
                url: 'Helpers/CalcResult7.ashx',
                data: { GU_ID: '<%=Request.QueryString["GUID"] %>' },
                success: function (data) {
                    list1 = eval(data);
                    temp = parseFloat(myJSONObject.bindings[0].value);
                    $("#<%=ProResult7.GetSpanId %>").text(addCommas(temp));
                }
            });
            return temp;
        }

【问题讨论】:

  • 很确定有一个选项可以强制调用同步,然后按预期工作....但可能不如预期。
  • 为什么要询问变量的范围?它没有任何问题 - 变量的值不是这样。
  • 查看我的回复,可能会有帮助

标签: javascript jquery ajax


【解决方案1】:

因为ajax调用是异步的,所以在更新之前就返回了temp……

【讨论】:

    【解决方案2】:

    因为在服务器返回 HTTP 响应之前,成功函数不会运行。

    Ajax 是异步的。

    对成功函数(或从它调用的函数)中的数据执行您想要执行的操作。

    不要试图等待响应然后将数据返回给调用函数。

    【讨论】:

      【解决方案3】:

      Ajax 调用是异步的,但您可以使用CommonJS Promises/A pattern 来实现您想要的。 jQuery 提供了它自己的实现:jQuery.Deferred()

      【讨论】:

        【解决方案4】:

        正如其他人在这里提到的,因为 ajax 是异步的,所以不能保证在 return 语句之前获得更新的 temp 变量。最好在您的成功职能范围内工作。但是,如果您绝对必须等待该调用完成并返回 temp 变量,您可以通过添加 async: false 使其成为非异步的

        function calc7() {
                var temp = 0;
                $.ajax({
                    type: "POST",
                    url: 'Helpers/CalcResult7.ashx',
                    data: { GU_ID: '<%=Request.QueryString["GUID"] %>' },
                    async: false,
                    success: function (data) {
                        list1 = eval(data);
                        temp = parseFloat(myJSONObject.bindings[0].value);
                        $("#<%=ProResult7.GetSpanId %>").text(addCommas(temp));
                    }
                });
                return temp;
            }
        

        【讨论】:

          【解决方案5】:

          S.ajax/$.post/$.get 等等,所有这些都是异步过程(这意味着,即使在 $.ajax 完成之前,您也会退出循环,即使它会进入服务器端退出循环后)

          function calc7() {
                      var temp = 0;
                      $.ajax({
                          type: "POST",
                          .............
                            ..............
                          }
                      });
                      return temp;
                  }
          

          所以如果你在循环之后检查,下面的语句可能没有执行(取决于数据集)。 temp = parseFloat(myJSONObject.bindings[0].value);

          所以要检查临时变量中的数据,您应该在 $.ajax 中放置一个调试器/警报。示例:

          function calc7() {
                      var temp = 0;
                      $.ajax({
                          type: "POST",
                          url: 'Helpers/CalcResult7.ashx',
                          data: { GU_ID: '<%=Request.QueryString["GUID"] %>' },
                          success: function (data) {
                              list1 = eval(data);
                              temp = parseFloat(myJSONObject.bindings[0].value);
          alert(temp);
                              $("#<%=ProResult7.GetSpanId %>").text(addCommas(temp));
                          }
                      });
                      return temp;
                  }
          

          现在你会得到 temp 的值

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-02-26
            • 1970-01-01
            • 2012-08-02
            • 2020-05-31
            • 1970-01-01
            • 2018-12-22
            • 2010-11-26
            • 2015-01-30
            相关资源
            最近更新 更多