كثيرًا ما أواجه موقفًا تحتاج فيه مهمة سلسلة غير متزامنة إلى نتائج العديد من المهام السابقة. الشلال غير المتزامن غير كافٍ لأنه يوفر فقط نتيجة المهمة السابقة الأخيرة. غير متزامن ، تلقائي مطول للغاية ، ويوفر تصريح تبعية إضافي غير ضروري.
ستكون الوظيفة الجديدة (أو تحسين السلسلة غير المتزامنة) مفيدة. ستتلقى كل مهمة كائن نتيجة يحتوي على نتائج جميع المهام السابقة
الأسماء الممكنة: تتراكم ، سلسلة تتراكم
مثال:
async.accumulate({
one: function(callback){
setTimeout(function(){
callback(null, 1);
}, 200);
},
two: function(callback, results){
// results: {one: 1}
setTimeout(function(){
callback(null, 2);
}, 100);
},
three: function(callback, results){
// results: {one: 1, two: 2}
setTimeout(function(){
callback(null, results.one + results.two);
}, 100);
}
},
function(err, results) {
// results is now equal to: {one: 1, two: 2, three: 3}
});
هل قمت بسحب async.auto
؟ إنه يفعل شيئًا مشابهًا جدًا لما تصفه.
كما ذكرت ، في سيناريو متزامن بسيط ، يعد async.auto مطولًا للغاية ، يجب على المستخدم أن يعلن أن كل خطوة تعتمد على الخطوة السابقة ، مما يؤدي إلى تلك المصفوفات القبيحة وأسماء الخطوات المكررة
async.auto({
one: function(callback){
setTimeout(function(){
callback(null, 1);
}, 200);
},
two: ["one", function(callback, results){
setTimeout(function(){
callback(null, 2);
}, 100);
}],
three: ["two", function(callback, results){
setTimeout(function(){
callback(null, results.one + results.two);
}, 100);
}
]
},
function(err, results) {
// results is now equal to: {one: 1, two: 2, three: 3}
});
سنقوم بإجراء بعض التحسينات على تلقائي في الإصدار الرئيسي التالي - دائمًا ما يكون رد الاتصال أخيرًا ، ونضيف أيضًا autoInject
(# 608) الذي يستنتج التبعيات من أسماء المعلمات.
لا يعجبني هذا الاقتراح لأنه يعتمد على ترتيب مفاتيح الكائنات - وهو أمر غير مضمون عبر بيئات JS (وهو مضمون فقط في Node للأشياء الصغيرة). يمكن استخدام المصفوفات ، ولكنه مشابه جدًا لـ async.waterfall
. لست متأكدًا من أننا بحاجة إلى شيء يتراوح بين auto
و waterfall
، خاصة إذا كنا نضيف autoInject
.
طريقة لتحقيق ما تريد:
function seriesAccumulate(tasks, done) {
async.reduce(tasks, [], function (results, task, next) {
task(results, function (err, result) {
results.push(result);
next(err, result);
});
}, done);
}
أوصي بعدم محاولة استخدام كائن للتكرار في سلسلة.
إغلاق هذا. لا أعتقد أننا بحاجة إلى طريقة أخرى بين series
و waterfall
في النمط.