โดยเฉพาะมันแตกต่างจากค่าเริ่มต้น ( async: true
) อย่างไร
ในสถานการณ์สิ่งที่ฉันต้องการชุดอย่างชัดเจนasync
ไปfalse
และไม่ได้มีสิ่งที่จะทำอย่างไรกับการป้องกันเหตุการณ์อื่น ๆ บนหน้าจากการยิง?
โดยเฉพาะมันแตกต่างจากค่าเริ่มต้น ( async: true
) อย่างไร
ในสถานการณ์สิ่งที่ฉันต้องการชุดอย่างชัดเจนasync
ไปfalse
และไม่ได้มีสิ่งที่จะทำอย่างไรกับการป้องกันเหตุการณ์อื่น ๆ บนหน้าจากการยิง?
คำตอบ:
มีบางอย่างเกี่ยวข้องกับการป้องกันไม่ให้เหตุการณ์อื่น ๆ บนหน้าเว็บถูกยิงหรือไม่
ใช่.
การตั้งค่า async เป็น false หมายถึงคำสั่งที่คุณกำลังเรียกใช้ให้เสร็จสมบูรณ์ก่อนที่จะเรียกใช้คำสั่งถัดไปในฟังก์ชันของคุณ หากคุณตั้งค่า async: จริงแล้วคำสั่งนั้นจะเริ่มต้นการดำเนินการและจะเรียกใช้คำสั่งถัดไปโดยไม่คำนึงว่าคำสั่ง async นั้นเสร็จสิ้นแล้วหรือยัง
สำหรับข้อมูลเชิงลึกเพิ่มเติมโปรดดูที่: jQuery ajax สำเร็จขอบเขตฟังก์ชั่นที่ไม่ระบุชื่อ
async: false
เอา asynchronousity จากสายสมบูรณ์ การเรียกไปยังajax
บล็อก - รหัสที่ตามมาจะไม่ถูกดำเนินการจนกว่าเซิร์ฟเวอร์จะตอบกลับ
async: false
จะตายแล้วฉันลองและได้รับ18:17:49.384 Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user’s experience. For more help http://xhr.spec.whatwg.org/ 1 jquery.js:9061:4
async:false
= รหัสหยุดชั่วคราว (รหัสอื่นกำลังรอให้การดำเนินการนี้เสร็จสิ้น)async:true
= รหัสต่อไป (ไม่มีอะไรหยุดชั่วคราวรหัสอื่นไม่รอ )ง่ายๆเช่นนี้
Async:False
จะระงับการเรียกใช้รหัสที่เหลือ เมื่อคุณได้รับการตอบสนองของ ajax เท่านั้นส่วนที่เหลือของรหัสจะดำเนินการ
หากคุณปิดใช้งานการดึงแบบอะซิงโครนัสสคริปต์ของคุณจะบล็อกจนกว่าคำขอจะได้รับการตอบสนอง มีประโยชน์สำหรับการดำเนินการตามลำดับของคำขอตามลำดับที่ทราบแม้ว่าฉันจะพบว่าการเรียกกลับแบบอะซิงก์นั้นสะอาดกว่า
กรณีใช้งานอย่างหนึ่งคือการajax
โทรออกก่อนที่ผู้ใช้จะปิดหน้าต่างหรือออกจากหน้า นี่จะเป็นการลบระเบียนชั่วคราวบางส่วนในฐานข้อมูลก่อนที่ผู้ใช้จะสามารถนำทางไปยังไซต์อื่นหรือปิดเบราว์เซอร์
$(window).unload(
function(){
$.ajax({
url: 'your url',
global: false,
type: 'POST',
data: {},
async: false, //blocks window close
success: function() {}
});
});
จาก
https://xhr.spec.whatwg.org/#synchronous-flag
Synchronous XMLHttpRequest นอกคนงานกำลังอยู่ในขั้นตอนการลบออกจากแพลตฟอร์มเว็บเนื่องจากมีผลเสียต่อประสบการณ์ของผู้ใช้ (นี่เป็นกระบวนการที่ใช้เวลานานหลายปี) นักพัฒนาจะต้องไม่ส่งค่าเท็จสำหรับอาร์กิวเมนต์ async เมื่อสภาพแวดล้อมส่วนกลางของ JavaScript เป็นสภาพแวดล้อมของเอกสาร ตัวแทนผู้ใช้ควรได้รับการสนับสนุนอย่างยิ่งให้เตือนเกี่ยวกับการใช้งานดังกล่าวในเครื่องมือของนักพัฒนาซอฟต์แวร์และอาจทำการทดลองโดยการโยนข้อยกเว้น InvalidAccessError เมื่อมันเกิดขึ้น ทิศทางในอนาคตคืออนุญาต XMLHttpRequests ในเธรดผู้ปฏิบัติงานเท่านั้น ข้อความมีไว้เพื่อเป็นคำเตือนถึงผลกระทบนั้น
การตั้งค่า async เป็น false หมายถึงคำแนะนำที่ตามหลังคำขอ ajax จะต้องรอคำขอให้เสร็จสมบูรณ์ ด้านล่างเป็นกรณีหนึ่งที่ต้องตั้งค่า async ให้เป็นเท็จเพื่อให้โค้ดทำงานอย่างถูกต้อง
var phpData = (function get_php_data() {
var php_data;
$.ajax({
url: "http://somesite/v1/api/get_php_data",
async: false,
//very important: else php_data will be returned even before we get Json from the url
dataType: 'json',
success: function (json) {
php_data = json;
}
});
return php_data;
})();
ตัวอย่างข้างต้นอธิบายการใช้async: falseอย่างชัดเจน
โดยการตั้งค่าเป็นเท็จเราได้ตรวจสอบให้แน่ใจว่าเมื่อข้อมูลถูกดึงกลับมาจากurlหลังจากที่ส่งคืน php_data เท่านั้น ถูกเรียก
return php_data
คำสั่งไม่สามารถอยู่ในฟังก์ชั่นความสำเร็จ แต่ต้องอยู่นอก$.ajax()
ฟังก์ชั่น ฉันใส่ของฉันเทียบเท่าreturn php_data
ภายในsuccess: function(){}
และมันก็มักจะกลับไม่ได้กำหนด
ใช้ทศนิยมตัวเลือกนี้: 3
นี่คือ URL: https://demos.telerik.com/kendo-ui/numerictextbox/index
<!DOCTYPE html>
<html>
<head>
<base href="https://demos.telerik.com/kendo-ui/numerictextbox/index">
<style>html { font-size: 14px; font-family: Arial, Helvetica, sans-serif; }</style>
<title></title>
<link rel="stylesheet" href="https://kendo.cdn.telerik.com/2019.3.1023/styles/kendo.default-v2.min.css" />
<script src="https://kendo.cdn.telerik.com/2019.3.1023/js/jquery.min.js"></script>
<script src="https://kendo.cdn.telerik.com/2019.3.1023/js/kendo.all.min.js"></script>
</head>
<body>
<div id="example">
<div id="add-product" class="demo-section k-content">
<p class="title">Add new product</p>
<ul id="fieldlist">
<li>
<label>
Price:
<input id="currency" type="number" title="currency" value="30" min="0" max="100" style="width: 100%;" />
</label>
</li>
<li>
<label>
Price Discount:
<input id="percentage" value="0.05" title="percentage" style="width: 100%;" />
</label>
</li>
<li>
<label>
Weight:
<input id="custom" value="2" title="custom" style="width: 100%;" />
</label>
</li>
<li>
<label>
Currently in stock:
<input id="numeric" type="number" title="numeric" value="17" min="0" max="100" step="1" style="width: 100%;" />
</label>
</li>
</ul>
</div>
<script>
$(document).ready(function() {
// create NumericTextBox from input HTML element
$("#numeric").kendoNumericTextBox();
// create Curerncy NumericTextBox from input HTML element
$("#currency").kendoNumericTextBox({
format: "c",
decimals: 3
});
// create Percentage NumericTextBox from input HTML element
$("#percentage").kendoNumericTextBox({
format: "p0",
min: 0,
max: 0.1,
step: 0.01
});
// create NumericTextBox from input HTML element using custom format
$("#custom").kendoNumericTextBox({
format: "#.00 kg"
});
});
</script>
<style>
.demo-section {
padding: 0;
}
#add-product .title {
font-size: 16px;
color: #fff;
background-color: #1e88e5;
padding: 20px 30px;
margin: 0;
}
#fieldlist {
margin: 0 0 -1.5em;
padding: 30px;
}
#fieldlist li {
list-style: none;
padding-bottom: 1.5em;
}
#fieldlist label {
display: block;
padding-bottom: .6em;
font-weight: bold;
text-transform: uppercase;
font-size: 12px;
}
#fieldlist label .k-numerictextbox {
font-size: 14px;
}
</style>
</div>
</body>
</html>