【问题标题】:Getting a return value via ajax通过ajax获取返回值
【发布时间】:2023-04-02 05:22:01
【问题描述】:

我有一个 python 脚本,我使用一个按钮和一些带有 ajax 的 javascript 从表单中调用它。我真的很难找到 python 脚本返回的返回变量。

所有返回的信息似乎都以错误的顺序发生,这可能不是这种情况,而是它在我看来的样子。我想要的只是能够获取我的 python 脚本返回的数据。这么简单的事情怎么会这么难!!

任何帮助将不胜感激。谢谢

这是我的代码:

            <script>
            function drawgraph() {
                    var x = draw()
                    alert(x)
            };
            </script>
            <script>
            function draw() {
                    alert("Hello");
                    $.ajax({
                            url: "/currentcost.py",
                            success: function(response){
                            alert("Success");
                            return response;
                            //here you do whatever you want with the response variable
                            }
                    });
                    alert("World");
            }
            </script>

我得到的响应是“Hello”、“World”、“Undefined”和“Success”

这对我来说,在我的 javascript 函数完成之后,ajax 函数才真正完成,这并不能帮助我真正掌握返回的变量,因此我可以稍后在 javascript 中使用它

克里斯

编辑。

    <head>
            <title>Line Chart</title>
            <script>
            var ajaxResponse = ""
            </script>
            <script src="Chart.js"></script>
            <script src="jquery.js"></script>
            <script>
                    function drawgraph() {
                            function handleResponse(response) {
                                    ajaxResponse = response;
                            }
                            draw(handleResponse);
                    };

                    function draw(handleResponse) {
                    $.ajax({
                    url: "/currentcost.py",
                    success: function(response){
                            handleResponse(response);
                    }
                    });
            }
            </script>
            <script>
                    function alertbox() {
                            alert(ajaxResponse);
                    }
            </script>

Currentcost.py:

导入 MySQL 数据库

定义索引(请求): dtbox = req.form.getfirst('dt', '') tmbox = req.form.getfirst('tm', '')

con = MySQLdb.connect('localhost', 'root', '', 'mydb')

with con:
    cur = con.cursor(MySQLdb.cursors.DictCursor)
    s = "SELECT tmp, watts FROM currentcost WHERE dt ='" + dtbox + "' and tm like '" + tmbox + "%'"
    cur.execute (s)
    rows = cur.fetchall()

    x=""
    y=""
    for row in rows:
        x=x+row["watts"]+","
        y=y+row["tmp"]+","

x="data:["+x+"]"
y="data:["+y+"]"

con.close()

req.write(x)

【问题讨论】:

    标签: javascript python ajax


    【解决方案1】:

    这就是异步编程的本质。它是非阻塞的。您必须在回调中启动需要 response 的代码的执行。

    【讨论】:

      【解决方案2】:

      Javascript 是异步的。当您警告x 时,它很可能是undefined,因为尚未收到 ajax 响应,或者甚至没有启动 ajax。传递一个可以处理响应的回调函数,而不是返回它:

      //global variable holding the response
      //substitutes your x
      var ajaxResponse;
      
      function drawgraph() {
          function handleResponse(response) {
              ajaxResponse = response; 
              //here you may want to do something with the response
              //like calling a function that uses the global variable ajaxResponse
      
              //alert(response);
          }
          draw(handleResponse);
      };
      
      function draw(handleReponse) {
          $.ajax({
             url: "/currentcost.py",
             success: function(response){
                 handleResponse(response);
             }
          });
      }
      

      编辑

      在我的小测试中,我只是在一个

      中调用了 drawgraph
      $(document).ready(function() {
        drawgraph();
      }
      

      例如,在页面加载时。一次。很清楚你想如何触发它。如果点击一个按钮,并且按钮id是“按钮”,&lt;button id="button"&gt;click&lt;/button&gt;

      $('#button').click(function() {
        drawgraph();
      }
      

      执行链:

      1. 调用绘图的东西
      2. drawgraph 调用 draw 并传递回调函数
      3. 在 ajax 成功时,回调函数会随响应调用

      由于 javascript 是异步的,你必须“等待”才能“继续执行其余代码”,最好的方法是从 $.ajax 成功内部继续执行。

      【讨论】:

      • 非常感谢大家,这对我来说都是新的,所以与其急于粘贴代码示例并陷入更大的混乱,我会做一些阅读并找出我哪里出错了!
      • 嗯,它的工作。我确实得到了返回的数据,但我希望一个警报框能提供数据,实际上会产生一个全新的页面。当然,我希望最终用变量替换警报框并继续使用其余代码(有效)。我能麻烦您解释一下上面发生的事情吗?我可以看到我的表单调用了 draw(),但是什么调用了 draw graph()?事实上,如果有任何东西调用 drawgraph(),它似乎会进入一个无限循环调用和调用 draw()。抱歉,我完全迷路了 :-( 我也在表单中使用 iframe。
      • 非常感谢。然而,我仍在挣扎。基本上,我将关闭其中的 3 组函数以从外部数据库收集数据。这个想法是将它们添加到一个全局变量中,当我绘制图表时可以使用它。我已经采取了在听众内部的 HTML 页面开头定义所有全局变量的步骤(。所以,每次我运行上面的函数时,我只是简单地做建议并保存到其中一个变量。使用 alert(myVar) 向表单添加一个按钮,但只是返回空白!我在原始帖子中编辑了脚本
      • @Dave 我现在越来越近了,发现了一些我在上面更正的错字。我得到的只是 Data[] 表明没有记录,但是,如果我从 python 脚本返回 s 而不是 x ,则 select 语句没有从表单字段中提取的日期。这表明 python 脚本由于某种原因没有读取表单字段。如果我提交表单的操作等于我的 python 脚本,我会得到一个包含正确数据的新页面!!所以,看起来我在某个地方遗漏了一些东西。
      【解决方案3】:

      Ajax 中的“A”是异步的。这意味着 HTTP 请求已完成,其余的 JS 代码将执行。您不能依赖 when 请求将完成,甚至 if 它会完成。任何依赖于请求返回值的工作都必须在回调中完成 (success)

      function (response) {
          alert("Success");
          // this will alert the response
          alert(response);
      }
      

      此外,来自回调的return 不会去任何地方。你也不会从draw返回。

      您可以使用 deferred 使语法更容易接受:

      function drawgraph() {
          var x = draw();
          x.done(function (response) {
              alert(x);
          });
      }
      function draw() {
          return $.ajax(/* your code */
      

      【讨论】:

        猜你喜欢
        • 2016-03-13
        • 1970-01-01
        • 2020-07-07
        • 2014-07-04
        • 1970-01-01
        • 1970-01-01
        • 2013-02-14
        • 2013-08-15
        • 1970-01-01
        相关资源
        最近更新 更多