Async: إصدار async.series حيث تتلقى كل مهمة نتائج جميع المهام السابقة

تم إنشاؤها على ١٦ نوفمبر ٢٠١٥  ·  5تعليقات  ·  مصدر: caolan/async

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

ستكون الوظيفة الجديدة (أو تحسين السلسلة غير المتزامنة) مفيدة. ستتلقى كل مهمة كائن نتيجة يحتوي على نتائج جميع المهام السابقة

الأسماء الممكنة: تتراكم ، سلسلة تتراكم

مثال:

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}
});
feature question

ال 5 كومينتر

هل قمت بسحب 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 في النمط.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات