【发布时间】:2020-04-24 22:28:56
【问题描述】:
我有一个名为scan() 的函数。它被循环调用。但是,它目前的工作方式:
- 致电
scan() - 等待
scan()返回 - 增加
min - 重复
我怎样才能让它同时运行scan() 的2 实例。我可以将2 实例更改为3 实例或4 或5 等。
示例: 我希望它是怎样的(在下面的示例中,scan() 的 3 实例在任何一个时间点都在运行。它不应该超过 3扫描运行的实例(相对于 while 循环条件)。
调用scan() 并在后台等待返回值。一旦它得到一个返回值,它就会增加min 并调用scan() 的另一个实例。总是有 3 的 scan() 实例在运行(相对于 while 循环条件)
<script type="text/javascript" src="https://code.jquery.com/jquery-1.9.1.min.js"></script>
<div class="display-error" style="display: none"></div>
<form>
<label for="fname">Fruit (only correct input is: banana)</label><br>
<input type="text" id="fruit-name" name="fruit" value="banana"><br>
<button type="submit" id="submit" value="Submit">Submit</button>
</form>
<div id="results">
</div>
<script type="text/javascript">
$(document).ready(function() {
$('#submit').click(function(e) {
e.preventDefault();
var fruitName = $("#fruit-name").val();
$.ajax({
type: "POST",
url: "verify-input.php",
dataType: "json",
data: {
fruitName: fruitName
},
success: function(data) {
if (data.code == 200) {
$("#submit").html("Running Scan");
(async function() {
var fruitID = data.fruitId;
var min = 1;
while (min < 1000) {
await scan(fruitID, min, min + 30);
min = min + 30;
}
})();
} else {
$(".display-error").html("<ul>" + data.msg + "</ul>");
$(".display-error").css("display", "block");
}
}
});
});
});
function scan(vFruitId, min, max) {
return $.ajax({
type: "POST",
url: "scanner.php",
dataType: "json",
data: {
vFruitId: vFruitId,
min: min,
max: max
},
success: function(data) {
data.forEach((item, idx) => {
$("#results").append(`
<div class="fruit-item" data-item="${idx}">
<div class="f-calories">calories: ${item.sweetness}</div>
<div class="f-sweetness">sweeteness: ${item.calories}</div>
<div class="f-bitterness">bitterness: ${item.bitterness}</div>
</div><br>
`);
})
}
});
}
</script>
【问题讨论】:
-
这是因为你的扫描函数没有返回任何承诺
-
@MisterJojo ,
$.ajax确实返回了一个承诺。问题是这些请求是同步运行的,而不是同时运行的。
标签: javascript html jquery while-loop async-await