تبسيط وعود في جافا سكريبت
-
21-12-2019 - |
سؤال
وفيما يلي مقتطفات الشفرة ما يعادل?
الإصدار 1
function doSomething() {
var defer = $q.defer();
foo().then(function() {
bar().then(function() {
defer.resolve();
});
});
return defer.promise;
}
الإصدار 2
function doSomething() {
return foo().then(bar);
}
المحلول
هناك العديد من الاختلافات بين هذين النهجين.
الفرق الرئيسي بين اثنين من القصاصات التي في version 2
يتم ضمنا تمرير قيمة من حل foo
مباشرة bar
.بالإضافة إلى أن doSomething
سيتم حل مهما كان bar
سيتم حل ، في حين أنه في version 1
والنتيجة هي التخلص منها.
بعض النقاط الهامة الإضافية التي قدمتها بنيامين Gruenbaum:
(أ) إذا كان شريط إشارة خطأ 1 ترفض الداخلية الوعد 2 يلقي.
(ب) 1 يتطلب الإشارة إلى $q حيث 2 هو تنفيذ الملحد.
(ج) الإصدار 1 ليست استثناء آمنة و الرفض ابتلع حيث الإصدار 2 سيتيح لك .قبض على الرفض.;هناك أصغر عدة اختلافات أيضا.انظر ستاكوفيرفلوو.com/أسئلة/22539815
يمكنك أيضا كتابة مثل هذا.
بهذه الطريقة أنت لا تحصل على الضمني تمر الحوض الصغير من حسم القيمة من foo
إلى bar
( انها صريحة الآن ) ، التي يمكن أن يكون مربكا أو التغاضي عنها بسهولة.فإنه يمكن أيضا أن تكون مفيدة إذا كنت تريد أن تفعل شيئا مع حل القيم foo
أو bar
قبل أن تعود لهم.
function doSomething() {
return foo().then(function(res){
// maybe do something with the result of foo
return bar(res);
}).then(function(res){
// maybe do something with the result of bar
return res;
});
}
يدويا إنشاء المؤجلة كائن يجب أن يكون الحد الأدنى و هو عموما مضاد نمط.
https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns#the-deferred-anti-pattern
المبدأ الأساسي التي تم شرحها هنا هو أن وعد تعتمد الدولة من عاد وعد ( أو thenable ) من الداخل حل الأسلوب.