为啥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”快一个数量级?
(JavaScript) 为啥 while 循环中的“if”中的 continue 语句会使浏览器崩溃?
StateFlowImpl collect有一个while循环,如果我在UI线程上使用它,为啥它不会阻塞UI线程