为啥javascript不会在while循环中堆叠

Posted

技术标签:

【中文标题】为啥javascript不会在while循环中堆叠【英文标题】:why java script doesn't stack inside the while loop为什么javascript不会在while循环中堆叠 【发布时间】:2019-12-28 15:38:47 【问题描述】:

我试图通过在ajax请求中通过for循环将值发送到php文件来检查数据库中的值,“请求中的每个值”然后文件返回变量称为“avl”if $data["avl"]==1所以如果没有则可用它不可用。

问题是我检查了一个值流,它们都必须返回1 才能继续我的过程,但条件不会等到 for 循环结束才检查。它在 for 循环开始之前检查条件,即使代码不是那样的。例如:它在 for 循环在第 50 行结束之前执行第 100 行的条件。

var cartItemContainer = document.getElementsByClassName('cart-items')[0]
var cartRows = cartItemContainer.getElementsByClassName('cart-row')
var avl_qty = 1;
for (var i = 0; i < cartRows.length; i++) 
    var cartItemContainer = document.getElementsByClassName('cart-items')[0]
    var cartRows = cartItemContainer.getElementsByClassName('cart-row')
    var cartRow = cartRows[i]

    var titleElement = cartRow.getElementsByClassName('cart-item-title')[0]
    var item = titleElement.innerText
    var quantityElement = cartRow.getElementsByClassName('cart-quantity-input')[0]
    var freequantityElement = cartRow.getElementsByClassName('cart-quantity-free-input')[0]

    var quantity = quantityElement.value
    var freequantity = freequantityElement.value

    alert("before avilability ajax")

    $.ajax(
        url: "checkavlqty.php",
        method: "POST",
        data: 

            item: item,
            quantity: quantity,
            freequantity: freequantity
        ,
        dataType: "JSON",
        success: function(data) 
            alert(JSON.stringify(data));
            if (data["avl"] == 0) 
                alert("inside condistion")
                avl_qty = 0;
            
        
    )



alert(avl_qty)

它总是提醒1,即使avl_qty的最终值是0

【问题讨论】:

【参考方案1】:

您在循环中执行的 ajax 调用是异步的,这意味着当执行到达$.ajax[...] 行时,它将在“后台”运行,而正常执行将继续通过循环。

您的代码中最有可能发生的是,在循环的 ajax 响应到达您之前,执行将到达 alert(avl_qty) 行。您可以通过让脚本运行来测试它。您会看到它将执行 alert("before avilability ajax"),然后是 alert(avl_qty),最后是来自 ajax 请求的所有 alert(JSON.stringify(data));

要解决此问题,您必须等待异步调用完成,you can use async/await 甚至回调,here's an example。

【讨论】:

这意味着所有的ajax请求都是异步运行的?抱歉这个愚蠢的问题,但我是一个新的开发者 不用担心,没有愚蠢的问题。是的,AJAX 请求始终是异步的。如果你想了解更多关于你正在使用的 jQuery ajax 方法的信息,你可以read it here。

以上是关于为啥javascript不会在while循环中堆叠的主要内容,如果未能解决你的问题,请参考以下文章

在 JavaScript 中,为啥“反向 while”循环比“for”快一个数量级?

TensorFlow:在while循环中堆叠张量

(JavaScript) 为啥 while 循环中的“if”中的 continue 语句会使浏览器崩溃?

StateFlowImpl collect有一个while循环,如果我在UI线程上使用它,为啥它不会阻塞UI线程

为啥在 Javascript 中不鼓励在 while 语句中赋值?

为啥while循环不退出?