อะไรคือความแตกต่างระหว่างรอการตัดบัญชีสัญญาและสัญญาซื้อขายล่วงหน้า?
มีทฤษฎีที่ได้รับการรับรองโดยทั่วไปอยู่เบื้องหลังทั้งสามนี้หรือไม่?
อะไรคือความแตกต่างระหว่างรอการตัดบัญชีสัญญาและสัญญาซื้อขายล่วงหน้า?
มีทฤษฎีที่ได้รับการรับรองโดยทั่วไปอยู่เบื้องหลังทั้งสามนี้หรือไม่?
คำตอบ:
ในแง่ของความไม่ชัดเจนว่าฉันพยายามตอบคำถามของ OP อย่างไร คำตอบที่แท้จริงคือสัญญาเป็นสิ่งที่ใช้ร่วมกันกับวัตถุอื่น ๆ ในขณะที่รอการตัดบัญชีควรจะเป็นส่วนตัว ในขั้นต้นการรอการตัดบัญชี (ซึ่งโดยทั่วไปจะขยายสัญญา) สามารถแก้ไขตัวเองในขณะที่สัญญาอาจไม่สามารถทำได้
หากคุณกำลังสนใจในข้อปลีกย่อยแล้วตรวจสอบสัญญา / A +
เท่าที่ฉันทราบวัตถุประสงค์ที่ครอบคลุมคือการปรับปรุงความชัดเจนและลดการเชื่อมต่อผ่านส่วนต่อประสานมาตรฐาน ดูการอ่านที่แนะนำจาก @ jfriend00:
แทนที่จะส่งผ่านการเรียกกลับไปยังฟังก์ชันโดยตรงสิ่งที่สามารถนำไปสู่อินเทอร์เฟซที่เชื่อมโยงกันอย่างแน่นหนาการใช้สัญญาอนุญาตให้แยกข้อกังวลสำหรับโค้ดที่ซิงโครนัสหรืออะซิงโครนัส
โดยส่วนตัวแล้วฉันพบว่าการรอการตัดบัญชีมีประโยชน์อย่างยิ่งเมื่อต้องจัดการกับแม่แบบเช่นที่บรรจุโดยคำขอแบบอะซิงโครนัสโหลดสคริปต์ที่มีเครือข่ายการพึ่งพาและให้ข้อเสนอแนะแก่ผู้ใช้เพื่อจัดรูปแบบข้อมูล
แน่นอนเปรียบเทียบรูปแบบการโทรกลับบริสุทธิ์ของการทำอะไรบางอย่างหลังจากโหลด CodeMirror ในโหมด JS แบบอะซิงโครนัส (ขอโทษฉันไม่ได้ใช้ jQuery ในขณะที่ ):
/* assume getScript has signature like: function (path, callback, context)
and listens to onload && onreadystatechange */
$(function () {
getScript('path/to/CodeMirror', getJSMode);
// onreadystate is not reliable for callback args.
function getJSMode() {
getScript('path/to/CodeMirror/mode/javascript/javascript.js',
ourAwesomeScript);
};
function ourAwesomeScript() {
console.log("CodeMirror is awesome, but I'm too impatient.");
};
});
สำหรับเวอร์ชันของสูตรสัญญา (อีกครั้งขอโทษฉันยังไม่เข้าใจ jQuery):
/* Assume getScript returns a promise object */
$(function () {
$.when(
getScript('path/to/CodeMirror'),
getScript('path/to/CodeMirror/mode/javascript/javascript.js')
).then(function () {
console.log("CodeMirror is awesome, but I'm too impatient.");
});
});
ขออภัยสำหรับโค้ดกึ่งหลอก แต่ฉันหวังว่ามันจะทำให้ความคิดหลักค่อนข้างชัดเจน โดยพื้นฐานแล้วการส่งคืนสัญญาที่ได้มาตรฐานคุณสามารถส่งผ่านสัญญาไปได้เพื่อให้สามารถจัดกลุ่มได้ชัดเจนยิ่งขึ้น
fn(callback, errback)
ไม่คู่ใด ๆ ที่แน่นหรือมีประโยชน์น้อยกว่าfn().then(callback, errback)
- แต่นั่นเป็นวิธีที่ผิดที่จะใช้สัญญาอยู่แล้ว ฉันเกลียด$.when
ตัวอย่างลัทธิขนส่งสินค้าโดยเฉพาะ- ไม่มีเหตุผลใดที่คุณไม่มี$.when
ฟังก์ชั่นที่ทำงานกับการโทรกลับ
คำตอบเหล่านี้รวมถึงคำตอบที่เลือกเป็นสิ่งที่ดีสำหรับการแนะนำแนวคิดสัญญา แต่ขาดในรายละเอียดของสิ่งที่แตกต่างในคำศัพท์ที่เกิดขึ้นเมื่อมีการใช้ห้องสมุดการใช้พวกเขา (และมี มีความแตกต่างที่สำคัญ)
เนื่องจากมันยังคงเป็นข้อมูลจำเพาะที่มีการพัฒนาอยู่ในขณะนี้คำตอบมาจากการพยายามสำรวจทั้งการอ้างอิง (เช่นวิกิพีเดีย ) และการใช้งาน (เช่นjQuery ):
รอการตัดบัญชี : ไม่เคยอธิบายไว้ในข้อมูลอ้างอิงที่เป็นที่นิยม
1 2 3 4
แต่โดยทั่วไปจะใช้งานโดยการใช้งานในฐานะผู้ตัดสินชี้ขาดสัญญา (การนำไปปฏิบัติและ)
5 6 7
resolve
reject
บางครั้ง deferreds นอกจากนี้ยังมีสัญญา (การดำเนินการthen
)
5 6
เวลาอื่น ๆ ก็เห็นเป็นที่บริสุทธิ์มากขึ้นที่จะมีการตัดบัญชีเพียงความสามารถในความละเอียดและบังคับให้ผู้ใช้สามารถเข้าถึงสัญญาสำหรับการใช้
7
then
สัญญา : คำที่ซับซ้อนที่สุดสำหรับกลยุทธ์ภายใต้การสนทนา
วัตถุพร็อกซีที่เก็บผลลัพธ์ของฟังก์ชันเป้าหมายที่มีความสอดคล้องกันที่เราต้องการสรุปรวมถึงการเปิดเผยthen
ฟังก์ชั่นที่รับฟังก์ชั่นเป้าหมายอื่นและส่งคืนสัญญาใหม่
2
ตัวอย่างจากCommonJS :
> asyncComputeTheAnswerToEverything()
.then(addTwo)
.then(printResult);
44
อธิบายเสมอในการอ้างอิงที่เป็นที่นิยมถึงแม้ว่าจะไม่ได้ระบุว่าการแก้ปัญหาความรับผิดชอบตกไปอยู่ที่ใด 1 2 3 4
ในอนาคต : คำที่ดูเหมือนจะคัดค้านพบในการอ้างอิงที่ได้รับความนิยม 1 และอย่างน้อยหนึ่งการใช้งานที่เป็นที่นิยม [ 8] แต่ดูเหมือนจะไม่ได้พูดคุยกันในการตั้งค่าสำหรับคำว่า 'สัญญา' 3 และไม่ได้กล่าวถึงเสมอ 9
อย่างไรก็ตามมีอย่างน้อยหนึ่งไลบรารีที่ใช้คำทั่วไปสำหรับการทำให้เกิดความสอดคล้องกันทางนามธรรมและการจัดการข้อผิดพลาดในขณะที่ไม่ได้จัดเตรียมการthen
ทำงาน
10
ไม่ชัดเจนหากหลีกเลี่ยงคำว่า 'สัญญา' โดยเจตนา แต่อาจเป็นทางเลือกที่ดีเนื่องจากมีการสร้างสัญญาขึ้นใน
2
ความแตกต่างระหว่างสัญญา / A และสัญญา / A +
(TL; DR, สัญญา / A + ส่วนใหญ่จะแก้ไขความคลุมเครือในสัญญา / A)
Task
สิ่งที่ทำให้ทุกอย่างคลิกสำหรับฉันคือการนำเสนอโดยโดเมนิคเดนิโคลา
ในส่วนแก็บ Githubเขาให้คำอธิบายที่ฉันชอบที่สุดมันกระชับมาก:
จุดประสงค์ของสัญญาคือการให้องค์ประกอบการทำงานและข้อผิดพลาดกลับมาในโลกของ async
ในคำอื่น ๆ สัญญาเป็นวิธีที่ช่วยให้เราเขียนโค้ดแบบอะซิงโครนัสที่เกือบจะง่ายต่อการเขียนราวกับว่ามันเป็นแบบซิงโครนัส
ลองพิจารณาตัวอย่างนี้โดยมีสัญญา:
getTweetsFor("domenic") // promise-returning async function
.then(function (tweets) {
var shortUrls = parseTweetsForUrls(tweets);
var mostRecentShortUrl = shortUrls[0];
return expandUrlUsingTwitterApi(mostRecentShortUrl); // promise-returning async function
})
.then(doHttpRequest) // promise-returning async function
.then(
function (responseBody) {
console.log("Most recent link text:", responseBody);
},
function (error) {
console.error("Error with the twitterverse:", error);
}
);
มันทำงานเหมือนกับว่าคุณกำลังเขียนรหัสซิงโครนัสนี้:
try {
var tweets = getTweetsFor("domenic"); // blocking
var shortUrls = parseTweetsForUrls(tweets);
var mostRecentShortUrl = shortUrls[0];
var responseBody = doHttpRequest(expandUrlUsingTwitterApi(mostRecentShortUrl)); // blocking x 2
console.log("Most recent link text:", responseBody);
} catch (error) {
console.error("Error with the twitterverse: ", error);
}
(ถ้ายังฟังดูซับซ้อนอยู่ให้ดูงานนำเสนอนั้น!)
เกี่ยวกับรอการตัดบัญชีมันเป็นวิธีการ.resolve()
หรือ.reject()
สัญญา ในข้อมูลจำเพาะสัญญา / Bจะถูกเรียก.defer()
ใช้ ใน jQuery $.Deferred()
ก็
โปรดทราบว่าเท่าที่ฉันทราบการดำเนินการตามสัญญาใน jQuery นั้นเสีย (ดูส่วนสำคัญ) อย่างน้อยเท่ากับ jQuery 1.8.2
มันควรจะใช้Promises / Aแล้ว แต่คุณไม่ได้รับข้อผิดพลาดที่ถูกต้องในการจัดการในแง่ที่ว่าฟังก์ชั่น "async try / catch" ทั้งหมดไม่ทำงาน อันไหนน่าเสียดายเพราะการมี "ลอง / จับ" ด้วยรหัส async นั้นยอดเยี่ยมมาก
หากคุณกำลังจะใช้สัญญา (คุณควรพยายามที่พวกเขาออกมาพร้อมกับรหัสของคุณเอง!) ให้ใช้กริช Kowal ของ Q รุ่น jQuery เป็นเพียงตัวรวบรวมการเรียกกลับบางส่วนสำหรับการเขียนโค้ด jQuery ที่สะอาดขึ้น แต่พลาดจุดไป
เกี่ยวกับอนาคตฉันไม่มีความคิดฉันไม่เห็นว่าใน API ใด ๆ
แก้ไข: youtube พูดคุยเกี่ยวกับสัญญาจากDomenic Denicolaจากความคิดเห็นของ@Farmด้านล่าง
ข้อความจาก Michael Jackson (ใช่Michael Jackson ) จากวิดีโอ:
ฉันต้องการให้คุณเผาผลาญวลีนี้ในใจของคุณ: สัญญาเป็นมูลค่าไม่ตรงกัน
นี่คือคำอธิบายที่ยอดเยี่ยม: สัญญาเป็นเหมือนตัวแปรจากอนาคต - การอ้างอิงชั้นหนึ่งถึงบางสิ่งบางอย่างที่จะมีอยู่ (หรือเกิดขึ้น)
สัญญาหมายถึงพร็อกซี่สำหรับค่าไม่จำเป็นต้องเป็นที่รู้จักกันเมื่อสัญญาที่ถูกสร้างขึ้น จะช่วยให้คุณสามารถเชื่อมโยงตัวจัดการกับค่าความสำเร็จในที่สุดของการกระทำไม่ตรงกันหรือเหตุผลความล้มเหลว วิธีนี้ทำให้เมธอดแบบอะซิงโครนัสส่งคืนค่าเช่นเมธอดแบบซิงโครนัส: แทนที่จะเป็นค่าสุดท้ายเมธอดแบบอะซิงโครนัสส่งคืนสัญญาว่าจะมีค่าในบางจุดในอนาคต
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
deferred.promise()
วิธีการช่วยให้การทำงานไม่ตรงกันเพื่อป้องกันไม่ให้รหัสอื่น ๆ จากการรบกวนความคืบหน้าหรือสถานะของคำขอภายใน สัญญาจะเปิดเผยเฉพาะวิธีการรอการตัดบัญชีที่จำเป็นในการแนบตัวจัดการเพิ่มเติมหรือกำหนดสถานะ ( จากนั้นทำ, ล้มเหลว, เสมอ, ไพพ์, ความคืบหน้า, สถานะและสัญญา ) แต่ไม่ใช่วิธีที่เปลี่ยนสถานะ ( แก้ไขปฏิเสธปฏิเสธแจ้งเตือนแก้ไขด้วย) ปฏิเสธด้วยและแจ้งเตือนด้วย )
หากมีการระบุเป้าหมายdeferred.promise()
จะแนบเมธอดเข้ากับมันจากนั้นส่งคืนออบเจ็กต์นี้แทนที่จะสร้างขึ้นมาใหม่ สิ่งนี้มีประโยชน์ในการแนบลักษณะการทำงานของสัญญากับวัตถุที่มีอยู่แล้ว
หากคุณกำลังสร้าง Deferred ให้อ้างอิงถึง Deferred เพื่อให้สามารถแก้ไขหรือปฏิเสธได้ในบางจุด ส่งคืนเฉพาะออบเจกต์ Promise ผ่าน deferred.promise () เพื่อให้โค้ดอื่น ๆ สามารถลงทะเบียนการเรียกกลับหรือตรวจสอบสถานะปัจจุบัน
เพียงแค่เราสามารถพูดได้ว่าสัญญาหมายถึงคุณค่าที่ยังไม่เป็นที่รู้จักในฐานะที่เป็นผู้รอการตัดบัญชีแทนงานที่ยังไม่เสร็จ
promise
แทนค่าที่ยังไม่ทราบ deferred
หมายถึงงานที่ยังไม่เสร็จสัญญาเป็นตัวยึดตำแหน่งสำหรับผลลัพธ์ที่ไม่เป็นที่รู้จักในขั้นต้นในขณะที่การรอการตัดบัญชีแสดงถึงการคำนวณที่ส่งผลให้เกิดมูลค่า
การอ้างอิง