Async: كسر سلسلة الشلال دون خطأ

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

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

التعليق الأكثر فائدة

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

هنا هو الحل المساعد الخاص بي إذا كان أي شخص مهتم ...

exports.breakWaterfall = function(tasks, callback){
    async.waterfall(tasks, function(){
        if(arguments[0] === 'break'){
            arguments[0] = null;
        }
        callback.apply(null, arguments);
    });
}

إذا كنت بحاجة إلى الانقطاع إلى الوظيفة الأخيرة داخل المهمة ، فما عليك سوى استدعاء رد الاتصال على النحو التالي: done('break', other, arguments); .

يكتشف المساعد فقط 'break' ويقوم بتغيير الوسيطات بحيث لا يبدو خطأ بالنسبة لبقية التعليمات البرمجية الخاصة بك.

ال 8 كومينتر

مرحبا،

ربما تكون قد حلت مشكلتك الآن ، بالمناسبة ، هذا هو أسلوبي:

var flow = [
    async.apply(...),
    // ...
];

async.waterfall(flow, function (err) {
    if (err === 'ok') return;
    // handle error
});

عندما تستدعي إحدى الوظائف رد اتصال بـ err = 'ok' ، فإن رد النداء النهائي للشلال يعترضه.

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

function search (cond, callback) {
  async.waterfall([function (cb) {
      db.get(cond, cb);
    },
    function (res, cb) {
      if (!res || !res.length)
        return cb.final();
      //do something useful
    }
  ], callback);
}

لن أضطر إلى التفاف رد الاتصال ويمكن ربطه ببقية البرنامج.

caolan هل هناك أي شيء لا يعجبك في طلب سحب jnordberg ؟ وإذا كان الأمر كذلك ، فهل هناك ما يمكنني فعله لقبول طلب السحب هذا؟

tax : لقد وجدت في الواقع أنه يمكننا التخطي إلى الوظيفة النهائية بتمرير "خطأ" = صحيح كالتالي:

async.waterfall ([الوظيفة (رد الاتصال) {
رد الاتصال (خالية) ؛ // <--- انتقل إلى fn التالي
} ،
وظيفة (رد) {
رد الاتصال (صحيح) ؛ // <--- تخطى إلى آخر fn
} ،
وظيفة (رد) {
رد الاتصال (خالية) ؛ // <--- لن يتم استدعاء هذا fn
}
]، أتصل مرة أخرى)؛

@ tot2ivn شكرا

إذا قمت بتعيين الخطأ ، فستكون النتيجة فارغة بالرغم من ذلك.

var async = require('async');

async.waterfall( [
  function( callback ){
    console.log('one');
    callback( null );
  },

  function( callback ){
    console.log('two');
    callback( true, 'more info' );
  },

  function( callback ){
    console.log('three');
    callback( null );
  }
], function(err, result){
  console.log( err, result );
} );

// RESULT
// one
// two
// true undefined

في ضوء تعليق caolan عند إغلاق طلب السحب رقم 85 ، ربما يجب إغلاق هذه المشكلة

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

هنا هو الحل المساعد الخاص بي إذا كان أي شخص مهتم ...

exports.breakWaterfall = function(tasks, callback){
    async.waterfall(tasks, function(){
        if(arguments[0] === 'break'){
            arguments[0] = null;
        }
        callback.apply(null, arguments);
    });
}

إذا كنت بحاجة إلى الانقطاع إلى الوظيفة الأخيرة داخل المهمة ، فما عليك سوى استدعاء رد الاتصال على النحو التالي: done('break', other, arguments); .

يكتشف المساعد فقط 'break' ويقوم بتغيير الوسيطات بحيث لا يبدو خطأ بالنسبة لبقية التعليمات البرمجية الخاصة بك.

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