سؤال

من ما فهمت أن هناك ثلاث طرق لدعوة الكود غير المتزامن:

  1. الأحداث ، على سبيل المثال request.on("event", callback);
  2. عمليات الاسترجاعات ، على سبيل المثال fs.open(path, flags, mode, callback);
  3. وعود

لقد وجدت مكتبة العقدة لكني لا أحصل عليه.

هل يمكن لأي شخص أن يشرح ما هي الوعود التي تدور حولها ولماذا يجب أن أستخدمها؟

أيضا ، لماذا تمت إزالته من node.js؟

هل كانت مفيدة؟

المحلول

وعدت الوعود في Node.js بالقيام ببعض الأعمال ، ثم كان لديها عمليات عروض على عاتق منفصلة سيتم تنفيذها من أجل النجاح والفشل وكذلك التعامل مع المهمات. هناك طريقة أخرى للتفكير في الوعود في Node.js وهي أنها كانت مناعبات يمكن أن تنبعث منها حدثين فقط: النجاح والخطأ.

الشيء الرائع في الوعود هو أنه يمكنك الجمع بينها في سلاسل التبعية (وعد C فقط عندما وعد أ و وعد ب كاملة).

من خلال إزالتها من Core Node.js ، فقد خلقت إمكانية بناء وحدات مع تطبيقات مختلفة من الوعود التي يمكن أن تجلس فوق القلب. بعض هذه عقدة و العقود الآجلة.

نصائح أخرى

نظرًا لأن هذا السؤال لا يزال لديه العديد من المشاهدات (مثل لي) أردت أن أشير إلى ذلك:

  1. عقدة يبدو ميتًا بالنسبة لي (كان الالتزام الأخير منذ حوالي عام واحد) ويحتوي على أي اختبارات تقريبًا.
  2. ال العقود الآجلة الوحدة النمطية تبدو متضخمة للغاية بالنسبة لي وهي موثقة بشكل سيء (وأعتقد أن اتفاقيات التسمية سيئة للغاية)
  3. يبدو أن أفضل طريقة للذهاب س إطار العمل, ، وهو نشط وموثوق جيدًا.

الوعد هو "الشيء" الذي يمثل نتائج "في نهاية المطاف" لعملية ما إذا إلى الكلام. النقطة التي يجب ملاحظتها هنا هي أنه يتجذ تفاصيل متى يحدث شيء ما ويسمح لك بالتركيز على ما يجب أن يحدث بعد، بعدما هذا شيء يحدث. سيؤدي هذا إلى رمز نظيف يمكن صيانته حيث بدلاً من الحصول على رد اتصال داخل رد الاتصال داخل رد الاتصال ، سيبدو الرمز الخاص بك مثل:

 var request = new Promise(function(resolve, reject) {
   //do an ajax call here. or a database request or whatever.
   //depending on its results, either call resolve(value) or reject(error)
   //where value is the thing which the operation's successful execution returns and
   //error is the thing which the operation's failure returns.
 });

 request.then(function successHandler(result) {
   //do something with the result
 }, function failureHandler(error) {
  //handle
 });

تنص مواصفات الوعود على أن الوعد

then

يجب أن تعيد الطريقة وعدًا جديدًا يتم الوفاء به عند الانتهاء من عملية الاتصال الناجحة أو رد الاتصال. هذا يعني أنه يمكنك سلسلة من الوعود معًا عندما يكون لديك مجموعة من المهام غير المتزامنة التي تحتاج إلى تنفيذ وتأكد من ضمان تسلسل العمليات كما لو كنت قد استخدمت عمليات الاسترداد. لذا بدلاً من تمرير رد اتصال داخل رد اتصال داخل رد الاتصال ، يشبه الرمز مع الوعود بالسلاسل:

var doStuff = firstAsyncFunction(url) {
                return new Promise(function(resolve, reject) {
                       $.ajax({
                        url: url,
                        success: function(data) {
                            resolve(data);
                        },
                        error: function(err) {
                             reject(err); 
                        } 
                  });
               };
doStuff
  .then(secondAsyncFunction) //returns a promise
  .then(thirdAsyncFunction); //returns a promise

لمعرفة المزيد عن الوعود ولماذا تكون رائعة للغاية ، مدونة Domenic المدونة: http://domenic.me/2012/10/14/youre-missing-the-point-of-promises/

هذه تعليمي جديد على الوعود من مؤلف من Pouchdb ربما يكون أفضل ما رأيته في أي مكان. إنه يغطي بحكمة أخطاء الصاعد الكلاسيكية التي تبين لك أنماط الاستخدام الصحيحة وحتى بعض النماذج المضادة التي لا تزال شائعة الاستخدام - حتى في البرامج التعليمية الأخرى !!

يتمتع!

ملاحظة: لم أجيب على بعض الأجزاء الأخرى من هذا السؤال حيث تم تغطيتها جيدًا من قبل الآخرين.

مايك تايليتر يحتوي على سلسلة من مقاطع الفيديو, ، كل واحد منهم أقل من عشر دقائق ، يصف كيف يعمل مكتبة WinJS.

تعد مقاطع الفيديو هذه مفيدة تمامًا ، ويمكن مايك من إظهار قوة واجهة برمجة تطبيقات Promise مع بعض أمثلة التعليمات البرمجية التي تم اختيارها جيدًا.

var twitterUrl = "http://search.twitter.com/search.json?q=windows";
var promise = WinJS.xhr({ url: twitterUrl });

 promise = promise.then(
     function (xhr) {
     },
     function (xhr) {
         // handle error
     });

إن معاملة كيفية التعامل مع الاستثناءات جيدة بشكل خاص.

على الرغم من مراجع WinJS ، فهذه سلسلة فيديو اهتمام عامة ، لأن واجهة برمجة تطبيقات Promise تشبه إلى حد كبير عبر العديد من تطبيقاتها.

من فضلك، أرسل رد هو تنفيذ وعد خفيف الوزن يمرر جناح اختبار الوعد/A+. أنا أحب واجهة برمجة التطبيقات ، لأنها تشبه الأناقة لواجهة WinJS.

تحديث أبريل 2014

بالمناسبة ، مكتبة WinJS هو الآن المصدر المفتوح.

ميزة أخرى للوعود هي أن معالجة الأخطاء ورمي الاستثناء والقبض أفضل بكثير من محاولة التعامل مع ذلك مع عمليات الاسترجاعات.

ال طائر أزرق تقوم المكتبة بتنفيذ الوعود وتمنحك آثارًا طويلة كبيرة في المكدس ، وهي سريعة جدًا ، وتحذر من الأخطاء غير المطلوبة. كما أنها أسرع وتستخدم ذاكرة أقل من مكتبات الوعد الأخرى ، وفقًا لـ http://bluebirdjs.com/docs/benchmarks.html

ما هو بالضبط الوعد؟

الوعد هو ببساطة كائن يمثل نتيجة عملية غير متزامنة. يمكن أن يكون الوعد في أي من الدول الثلاث التالية:

ريثما :: هذه هي الحالة الأولية ، يعني أن الوعد لا يتم الوفاء به أو رفضه.

استيفاء :: هذا يعني أن الوعد قد تم الوفاء به ، يعني أن القيمة التي يمثلها الوعد جاهزة للاستخدام.

مرفوض :: هذا يعني أن العمليات فشلت وبالتالي لا يمكن الوفاء بالوعد. بصرف النظر عن الولايات ، هناك ثلاثة كيانات مهمة مرتبطة بالوعود التي نحتاجها حقًا إلى فهمها

  1. وظيفة Executor :: وظيفة Executor تحدد عملية ASYNC التي يجب تنفيذها والتي تمثل النتيجة النتيجة بالوعد. يبدأ التنفيذ بمجرد تهيئة كائن الوعد.

  2. حل :: حل هو معلمات تم تمريرها إلى وظيفة المنفذ ، وفي حالة تشغيل المنفذ بنجاح ثم يسمى هذا العزم تمرير النتيجة.

  3. رفض :: الرفض هو معلمة أخرى تم تمريرها إلى وظيفة المنفذ ، ويتم استخدامها عند فشل وظيفة المنفذ. يمكن تمرير سبب الفشل إلى الرفض.

لذلك كلما أنشأنا كائن الوعد ، يتعين علينا توفير المنفذ والحل والرفض.

المرجعي :: وعود

لقد كنت أبحث أيضًا عن الوعود في Node.js مؤخرًا. حتى الآن عندما يبدو أن السبيل للذهاب بسبب سرعة واستخدام الموارد ، ولكن الوثائق على س أعطاني فهم أفضل بكثير. لذا استخدم متى. js ولكن مستندات Q.JS لفهم الموضوع.

من س ReadMe على جيثب:

إذا لم تتمكن الدالة من إرجاع قيمة أو رمي استثناء دون حظر ، فيمكنها إرجاع الوعد بدلاً من ذلك. الوعد هو كائن يمثل قيمة الإرجاع أو الاستثناء الذي تم إلقاؤه الذي قد توفره الوظيفة في النهاية. يمكن أيضًا استخدام الوعد كبديل لكائن بعيد للتغلب على الكمون.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top