【问题标题】:JSON return value to global variableJSON返回值到全局变量
【发布时间】:2015-08-01 03:32:32
【问题描述】:

只是我的代码看起来像这样:

 var thevariable = 0;

For(){
//somecode using thevariable
$.getJSON('',{},function(e){
//success and i want to set the returned value from php to my variable to use it in the forloop

thevariable = e.result;
});
}

我的主要问题是变量值在整个 For 循环中保持“0”,而我只希望它在第一个循环中为“0”,然后它将 PHP 返回的结果用于 for 循环.

如果你需要看一下,这里是我的真实代码:

var orderinvoice = 0;
for(var i=0; i<table.rows.length; i++){
                            var ordername = table.rows[i].cells[5].innerText;
                            var orderqty = ((table.rows[i].cells[1].innerText).replace(/\,/g,'')).replace(/Qty /g,'');
                            var orderprice = (table.rows[i].cells[2].innerText).replace(/\$/g,'');
                            var ordertype = table.rows[i].cells[3].innerText;
                            var orderlink = table.rows[i].cells[4].innerText;

      $.getJSON('orderprocess.php', {'invoice': orderinvoice, 'pay_email': email, 'ord_name': ordername, 'ord_qty': orderqty, 'ord_price': orderprice, 'ord_type': ordertype, 'ord_link': orderlink}, function(e) {
          console.log();
          document.getElementById("result").innerText= document.getElementById("result").innerText + "Order #"+e.result+" Created Successfully ";
         document.getElementById("invoker").innerText = ""+e.invoice;
         orderinvoice = e.invoice;

          if(i+1 == table.rows.length){
            document.getElementById("result").innerText= document.getElementById("result").innerText + "With invoice #" + e.invoice;
          }
 });

【问题讨论】:

  • for 循环不会等到您的 异步 Ajax 调用收到响应。您不能在此处使用循环。请参阅stackoverflow.com/q/23667086/218196
  • 对“异步”的含义进行一些研究,然后您可能会更好地了解为什么您的for 在第一个异步响应完成之前就运行完成了。

标签: javascript php ajax json


【解决方案1】:

在一个循环块中,在一个 ajax 完成之前,另一个将运行,这是 javascript 自然处理。对于您的情况,您可以在成功事件结束时调用一个函数。做这样的事情:

var i = 0;    
doSt();

function doSt() {
    var orderinvoice = 0;

        var ordername = table.rows[i].cells[5].innerText;
        var orderqty = ((table.rows[i].cells[1].innerText).replace(/\,/g, '')).replace(/Qty /g, '');
        var orderprice = (table.rows[i].cells[2].innerText).replace(/\$/g, '');
        var ordertype = table.rows[i].cells[3].innerText;
        var orderlink = table.rows[i].cells[4].innerText;

        $.getJSON('orderprocess.php', { 'invoice': orderinvoice, 'pay_email': email, 'ord_name': ordername, 'ord_qty': orderqty, 'ord_price': orderprice, 'ord_type': ordertype, 'ord_link': orderlink }, function(e) {
            console.log();
            document.getElementById("result").innerText = document.getElementById("result").innerText + "Order #" + e.result + " Created Successfully ";
            document.getElementById("invoker").innerText = "" + e.invoice;
            orderinvoice = e.invoice;

            if (i + 1 == table.rows.length) {
                document.getElementById("result").innerText = document.getElementById("result").innerText + "With invoice #" + e.invoice;
            }
            i++;
            if (i < table.rows.length) doSt();
        });
    }

【讨论】:

    【解决方案2】:

    我认为您需要一个递归函数,该函数始终处理行数组中的第一个元素,然后将其拼接并调用自身。例如,像这样:

    function getStuff(rows, results) {
        if (rows.length > 0) {
            var ordername = rows[0].cells[5].innerText;
    
            $.getJSON('orderprocess.php', { 'ord_name': ordername }, function (e) {
                // do some stuff
                results.push('aggregate some things here?');
                rows.splice(0, 1);
                return getStuff(rows, results);
            });
        } else {
            return results;
        }
    }
    

    当数组用完时,结果将在循环结束时返回您想要的任何聚合。然后,您可以随心所欲地处理结果。我认为如果这更有意义的话,你也可以按照你认为合适的方式操作函数内部的 DOM。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      • 1970-01-01
      • 2021-11-07
      相关资源
      最近更新 更多