يسمى وضع برمجة الوعد أيضًا ، والذي يمكن فهمه على أنه التنفيذ بعد التأخير. كل وعد له واجهة فريدة تسمى آنذاك ، وعندما يفشل الوعد أو ينجح ، فإنه سيؤدي إلى رد اتصال. إنه يمثل نتيجة العملية التي قد تعمل لفترة طويلة ولا يجب إكمالها بالضرورة. لا يمنع هذا النمط وينتظر إكمال العمليات طويلة الأجل ، ولكنه يعيد كائنًا يمثل النتيجة الموعودة.
تضيف العديد من مكتبات JavaScript الحالية (مثل jQuery و Dojo ، AngularJS) هذا التجريد المسمى Promise. من خلال هذه المكتبات ، يمكن للمطورين استخدام وضع الوعد في البرمجة الفعلية.
أدناه ، سنستخدم jQuery كمثال لمناقشة كيفية استخدام مكتبات JavaScript لوضع الوعد للتعامل مع المعالجة غير المتزامنة ، والتي هي في الواقع لتوفير الدعم المتحمل للأخطاء من خلال عمليات الاسترجاعات. عندما تنجح العملية أو تفشل أو على أي حال ، يتم تنفيذ رد الاتصال المقابل ، ومحاولة التعامل مع أي مواقف محتملة في جزء معين من المنطق.
أولاً ، دعنا نلقي نظرة على كيفية عمل jQuery بشكل عام:
نسخة الكود كما يلي:
var $ info = $ ("#info") ؛
$ .ajax ({
عنوان URL: "/echo/json/" ،
البيانات: {json: json.stringify ({"name": "SomeValue"})} ،
النوع: "بعد" ،
النجاح: وظيفة (استجابة)
{
$ info.text (response.name) ؛
}
}) ؛
في هذا المثال ، يمكنك أن ترى أنه عندما يكون الإعداد ناجحًا ، سيتم تحديد رد الاتصال ، وهي طريقة رد اتصال جيدة. هذا ليس وعدًا ، ولم تعد وثائق jQuery الرسمية توصي بهذه الطريقة (http://api.jquery.com/jquery.ajax/#jqxhr). عند اكتمال مكالمة AJAX ، تنفذ وظيفة النجاح. اعتمادًا على العمليات غير المتزامنة التي تستخدمها المكتبة ، يمكنك استخدام عمليات الاسترجاعات المختلفة المختلفة (على سبيل المثال ، ما إذا كانت المهمة ناجحة أم لا ، سيتم استدعاؤها مرة أخرى والاستجابة). يؤدي استخدام وضع الوعد إلى تبسيط هذه العملية ، وتتطلب العمليات غير المتزامنة فقط إرجاع مكالمة كائن. يتيح لك هذا الوعد استدعاء طريقة تسمى ثم ثم يتيح لك تحديد عدد الوظائف (الوظائف) للاستدعاء.
دعونا نلقي نظرة على كيفية بناء jQuery وعدًا:
نسخة الكود كما يلي:
var $ info = $ ("#info") ؛
$ .ajax ({
عنوان URL: "/echo/json/" ،
بيانات: {
json: json.stringify ({
"الاسم": "SomeValue"
})
} ،
النوع: "بعد"
})
. ثم (وظيفة (استجابة) {
$ info.text (response.name) ؛
}) ؛
يقوم كائن jQuery Ajax بتنفيذ وضع الوعد عن طريق إرجاع كائن XHR ، حتى نتمكن من استدعاء الطريقة ثم. ميزة القيام بذلك هي أنه يمكنك سلسلة المكالمات وتنفيذ عمليات مستقلة ، كما هو موضح أدناه:
نسخة الكود كما يلي:
var $ info = $ ("#info") ؛
$ .ajax ({
عنوان URL: "/echo/json/" ،
بيانات: {
json: json.stringify ({
"الاسم": "SomeValue"
})
} ،
النوع: "بعد"
})
. ثم (وظيفة (استجابة) {
$ info.text (response.name) ؛
})
.Then (function () {
$ info.append ("... المزيد") ؛
})
.done (function () {
$ info.append ("... أخيرًا!") ؛
}) ؛
تصبح العمليات غير المتزامنة سهلة للغاية لأن العديد من المكتبات تبدأ في استخدام وضع الوعد. ولكن إذا فكرت من المنظور المعاكس ، كيف يمكن أن يبدو الوعد؟ أحد الأنماط المهمة للغاية هو أن الوظيفة يمكن أن تقبل وظيفتين ، والآخر هو رد رد على رد عندما ينجح ، والآخر هو رد اتصال عند الفشل.
نسخة الكود كما يلي:
var $ info = $ ("#info") ؛
$ .ajax ({
// تغيير عنوان URL لرؤية الخطأ يحدث
عنوان URL: "/echo/json/" ،
بيانات: {
json: json.stringify ({
"الاسم": "SomeValue"
})
} ،
النوع: "بعد"
})
. ثم (وظيفة (استجابة) {
// نجاح
$ info.text (response.name) ؛
} ،
وظيفة () {
// فشل
$ info.text ("الأشياء السيئة تحدث للمطورين الجيدين") ؛
})
.always (function () {
$ info.append ("... أخيرًا") ؛
}) ؛
تجدر الإشارة إلى أنه في jQuery ، سواء كانت ناجحة أو فشل ، سنستخدم مكالمة لتحديد ما نريد الاتصال به.
في الواقع ، يمكنك أيضًا كتابة هذا هنا ، وهي الطريقة الموصى بها أيضًا في المستند الرسمي لـ JQuery:
نسخة الكود كما يلي:
var $ info = $ ("#info") ؛
$ .ajax ({
// تغيير عنوان URL لرؤية الخطأ يحدث
عنوان URL: "/echo/json/" ،
بيانات: {
json: json.stringify ({
"الاسم": "SomeValue"
})
} ،
النوع: "بعد"
})
.done (وظيفة (استجابة) {
// نجاح
$ info.text (response.name) ؛
}). FAIL (function () {
// فشل
$ info.text ("الأشياء السيئة تحدث للمطورين الجيدين") ؛
})
.always (function () {
$ info.append ("... أخيرًا") ؛
}) ؛
دعونا نلقي نظرة على كيفية استخدام AngularJS لوضع الوعد:
نسخة الكود كما يلي:
var m = Angular.module ("myapp" ، []) ؛
M.Factory ("DataService" ، وظيفة ($ Q) {
الدالة _callme () {
var d = $ q.defer () ؛
setTimeout (function () {
D.Resolve () ؛
//defer.reject () ؛
} ، 100) ؛
عودة D.Promise ؛
}
يعود {
Callme: _callme
} ؛
}) ؛
وظيفة myctrl (نطاق $ ، dataService) {
$ scope.name = "none" ؛
$ scope.isbusy = true ؛
dataservice.callme ()
.Then (function () {
// ناجح
$ scope.name = "success" ؛
} ،
وظيفة () {
// فشل
$ scope.name = "failure" ؛
})
.Then (function () {
// مثل بند أخيرًا
$ scope.isbusy = false ؛
}) ؛
}
يمكنك تجربة هذه الأمثلة في JSFiddle ومعرفة الآثار التي سيتم إنتاجها. يعد استخدام الوعد لتشغيل غير متزامن طريقة بسيطة للغاية ، ويمكنه أيضًا تبسيط الكود الخاص بك. إنها في الواقع طريقة جيدة لقتل عصفورين بحجر واحد.
لمزيد من التقديمات والأمثلة حول الوعد ، يمكنك الانتقال إلى الموقع الرسمي (http://www.promisejs.org/).