将JSON返回值赋给全局变量

4

我的代码看起来就像这样:

 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调用接收响应。你不能在这里使用循环。请参见https://dev59.com/j2Ag5IYBdhLWcg3wYaC6。 - Felix Kling
先对“异步”有所了解,然后你可能会更清楚为什么你的 for 循环在第一个异步响应完成之前就已经运行完毕了。 - jfriend00
2个回答

1

在一个循环块中,在一个 ajax 完成之前,另一个 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();
        });
    }

1

我认为你需要一个递归函数,它总是处理你的行数组中的第一个元素,然后将其切掉并调用自身。例如,像这样:

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。希望这有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接