من السهل بشكل عام تصحيح البرمجة المتزامنة وصيانتها ، ومع ذلك ، فإن البرمجة غير المتزامنة توفر بشكل عام أداء أفضل ومرونة أكبر. أكبر ميزة غير متزامنة هي أنه لا توجد حاجة للانتظار. أصبحت "الوعود" تدريجياً الجزء الأكثر أهمية في JavaScript ، وقد بدأ عدد كبير من واجهات برمجة التطبيقات الجديدة في تنفيذ مبدأ الوعد. دعونا نلقي نظرة على ما هو الوعد ، وواجهة برمجة التطبيقات (API) واستخدامها!
يعد الوضع
يعد API XMLHTTPrequest غير متزامن ، لكنه لا يستخدم واجهة برمجة تطبيقات الوعد. ولكن هناك العديد من واجهات برمجة تطبيقات JavaScript الأصلية التي تستخدم الوعد:
*بطارية API
*جلب API (بديل لـ XHR)
*ServiceWorker API
ستصبح الوعود أكثر شعبية وشائعة في المستقبل ، ومن المهم للغاية أن يستخدمها جميع المطورين الأماميين. شيء آخر يستحق الإشارة إليه هو أن Node.js هو منصة تعتمد على الوعود (من الواضح أن الوعد هو ميزة أساسية لها).
استخدام الوعود أبسط مما تعتقد - إذا كنت تستخدم لاستخدام setTimeout للتحكم في المهام غير المتزامنة!
الاستخدام الأساسي للوعد
يمكن استخدام مُنشئ الوعد الجديد () في المهام غير المتزامنة التقليدية ، تمامًا مثل الاستخدام السابق لـ SetTimeout و XMLHTTPrequest. يتم إنشاء وعد جديد باستخدام الكلمة الرئيسية الجديدة. في الوقت نفسه ، توفر هذه الوعود وظائف حل ورفض للسماح لنا بإجراء عمليات رد الاتصال:
var p = New Promise (function (حل ، رفض) {// قم بمهمة Async مهمة ASYNC ثم ... إذا (/ * حالة جيدة */) {حل ('النجاح!) ؛} آخر {رفض (' فشل!) ؛}}) ؛يمكن للمبرمجين الاتصال يدويًا ويرفض الوظائف داخل وظيفة رد الاتصال وفقًا لحالة التنفيذ. فيما يلي مثال أكثر واقعية يحول مكالمة XMLHTTPrequest إلى مهمة قائمة على الوعود:
// من وعود Jake Archibald و Back: // http://www.html5rocks.com/en/tutorials/es6/promises/#toc-promising-xmlhttprequestfunction get (url) {// return a new freat. إرجاع وعد جديد (الوظيفة (حل ، رفض) {// ، قم بعمل الأشياء XHR المعتادة var req = new xmlhttprequest () ؛ req.open ('get' ، url) ؛ req.onload = function () {// هذا يسمى حتى على 404 وما إلى ذلك. req.Response) ؛ إنه! الحصول على ('story.json').Promise.Resolve () و Promise.Reject () يمكن استدعاء مباشرة. في بعض الأحيان ، عندما نحدد أن الوعد لا يلزم تنفيذه ، لا نحتاج إلى استخدام جديد لإنشاء كائن وعد ، ولكن يمكننا استدعاء الوعد مباشرة. على سبيل المثال:
var usercache = {} ؛ function getUserDetail (اسم المستخدم) {// في كلتا الحالتين ، مخزنة مؤقتًا أم لا ، سيتم إرجاع الوعد إذا (usercache [username]) {// إرجاع وعد دون "عودة الكلمة الرئيسية الجديدة" (usercache [username]) ؛ } // استخدم API Fetch للحصول على المعلومات // يجلب إرجاع الوعد إرجاع إرجاع ('المستخدمين/' + اسم المستخدم + '.json'). ثم (الوظيفة (النتيجة) {UserCache [username] = result ؛ return return ؛}) .catch (function () {رمي خطأ جديد ("لا يمكن العثور على المستخدم:" + username) ؛}) ؛لأن الوعد سيعود بالتأكيد ، يمكننا استخدام الأساليب ثم التقاطها للتعامل مع قيمة الإرجاع!
ثم الطريقة
جميع مثيلات كائن الوعد لها طريقة آنذاك ، والتي تستخدم للتفاعل مع هذا الوعد. أولاً ، ستستدعي الطريقة التي تنطلق وظيفة حل () افتراضيًا:
وعد جديد (دالة (حل ، رفض) {// إجراءات غير متصلة mock باستخدام setTimeOut setTimeOut (function () {حل (10) ؛} ، 3000) ؛}). ثم (الوظيفة (النتيجة) {console.log (result) ؛ثم يتم تنفيذ الوقت المثير لإجراءات رد الاتصال هو أن الوعد يتم تنفيذه. يمكننا أيضًا إجراء عمليات رد الاتصال في Concatenated طريقة آنذاك:
وعد جديد (دالة (حل ، رفض) {// إجراءات غير متصلة mock باستخدام setTimeOut setTimeOut (function () {solop (10) ؛} ، 3000) ؛}). }).ستجد أن كل مكالمة ثم ستأخذ قيمة الإرجاع الخاصة بالسباق ثم اتصل كمعلمة.
إذا تم تنفيذ وعد وتم استدعاء الأغنية مرة أخرى ، فسيتم تنفيذ إجراء رد الاتصال مرة أخرى. إذا تم تنفيذ وظيفة رد الاتصال في هذا الوعد ، ويتم استدعاء الطريقة التي يتم استدعاؤها ، فلن يتم تنفيذ وظيفة رد الاتصال.
طريقة الصيد
الصيد عند رفض الوعد (رفض) ، سيتم تنفيذ طريقة الصيد:
وعد جديد (دالة (حل ، رفض) {// إجراء غير متزامن mock باستخدام setTimeOut setTimeOut (function () {reject ('dese!) ؛} ، 3000) ؛}). منتهي!'عادةً ما نتعامل مع نتيجة فشل التنفيذ في طريقة الرفض ، وننفذ الاستثناء يؤدي إلى الصيد:
رفض (خطأ ("لا يمكن العثور على البيانات")) ؛
الوعد. الطريقة
غالبًا ما يكون هناك سيناريو عندما ندعو بشكل غير متزامن: نحتاج إلى استدعاء عمليات غير متزامنة متعددة في نفس الوقت ، لكننا نأمل أن نجري فقط عملية الاستجابة بعد اكتمال جميع العمليات - هذا هو دور الوعد. يمكن أن تتلقى طريقة الوعد.
Promise.all ([Promise1 ، Promise2]).
مثال جيد على استخدام الوعد. كل ذلك هو إجراء عمليات Ajax المتعددة (عبر Fetch):
var request1 = fetch ('/user.json') ؛ var request2 = fetch ('/articles.json') ؛ promise.all ([request1 ، request2]).يمكننا أيضًا إجراء مزيج من واجهات برمجة التطبيقات للبطارية و APIs ، لأنهم جميعًا يعودون الوعود:
Promise.all ([fetch ('/user.json') ، navigator.getBattery ()]). ثم (الوظيفة (النتائج) {// كلا الوعود المنجزة!}) ؛بمجرد استدعاء وظيفة الرفض في الوعد ، يتم رفض التنفيذ ولا يمكن إكماله بشكل طبيعي ، سيكون الموقف معقدًا بعض الشيء. بمجرد رفض الوعد ، ستقوم طريقة الصيد بتقديم أول وظيفة رفض تنفيذها:
var req1 = New Promise (function (حل ، رفض) {// إجراء mock async باستخدام setTimeOut setTimeOut (function () {حل ('أولاً!') ؛} ، 4000) ؛}) ؛ var req2 = new promise (function ، refject) {// a async action باستخدام setTimeOut (function ؛ 3000) ؛}) ؛ promise.all ([req1 ، req2]).الوعد. كل واجهة مهمة للغاية وسوف تلعب دورًا مهمًا في العديد من واجهات برمجة تطبيقات الوعد المولودة حديثًا.
وعد
Promise.race هي وظيفة مثيرة للاهتمام - لا تنتظر حل جميع الوعود أو رفضها ، ولكن في جميع الوعود ، ستطلق النار طالما انتهى إعدام واحد:
var req1 = New Promise (function (حل ، رفض) {// إجراءات غير متزامنة mock باستخدام setTimeOut setTimeOut (function () {حل ('أولاً!') ؛} ، 8000) ؛}) ؛ var req2 = new promise (function ، refject) {// a async action باستخدام setTimeOut (function) 3000) ؛}) ؛ promise.race ([req1 ، req2]).سيناريو مفيد هو تنزيل الموارد من خوادم المرآة المتعددة. بمجرد عودة المرء ، لا تتم معالجة العائدات الأخرى.
تعلم استخدام الوعود
كانت الوعود موضوعًا ساخنًا للغاية في السنوات القليلة الماضية ، وقد تم سحبه من JavaScript ليصبح بنية لغة. أعتقد أننا سنرى قريبًا المزيد والمزيد من واجهات برمجة تطبيقات JavaScript التي ستستخدم الأنماط القائمة على الوعد.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.