[Javascript] رد الاتصال بعد اكتمال كل الاسترجاعات غير المتزامن forEach



Answers

إذا واجهت وظائف غير متزامنة ، وتريد التأكد من أنه قبل تنفيذ الشفرة ، تنتهي مهمتها ، يمكننا دائمًا استخدام إمكانية رد الاتصال.

فمثلا:

var ctr = 0;
posts.forEach(function(element, index, array){
    asynchronous(function(data){
         ctr++; 
         if (ctr === array.length) {
             functionAfterForEach();
         }
    })
});

ملاحظة: functionAfterForEach هي وظيفة ليتم تنفيذها بعد انتهاء مهام foreach. غير متزامن هي الوظيفة غير المتزامنة المنفذة داخل foreach.

أتمنى أن يساعدك هذا.

Question

كما يوحي العنوان. كيف أقوم بهذا العمل؟

أرغب في الاتصال whenAllDone() بعد أن مرت حلقة forEach خلال كل عنصر وقمت ببعض المعالجة غير المتزامنة.

[1, 2, 3].forEach(
  function(item, index, array, done) {
     asyncFunction(item, function itemDone() {
       console.log(item + " done");
       done();
     });
  }, function allDone() {
     console.log("All done");
     whenAllDone();
  }
);

ممكن للحصول عليها للعمل مثل هذا؟ عندما تكون الوسيطة الثانية لـ forEach عبارة عن وظيفة رد اتصال يتم تشغيلها بمجرد مر كل التكرارات؟

الناتج المتوقع:

3 done
1 done
2 done
All done!



بلدي الحل:

//Object forEachDone

Object.defineProperty(Array.prototype, "forEachDone", {
    enumerable: false,
    value: function(task, cb){
        var counter = 0;
        this.forEach(function(item, index, array){
            task(item, index, array);
            if(array.length === ++counter){
                if(cb) cb();
            }
        });
    }
});


//Array forEachDone

Object.defineProperty(Object.prototype, "forEachDone", {
    enumerable: false,
    value: function(task, cb){
        var obj = this;
        var counter = 0;
        Object.keys(obj).forEach(function(key, index, array){
            task(obj[key], key, obj);
            if(array.length === ++counter){
                if(cb) cb();
            }
        });
    }
});

مثال:

var arr = ['a', 'b', 'c'];

arr.forEachDone(function(item){
    console.log(item);
}, function(){
   console.log('done');
});

// out: a b c done



حل بسيط سيكون مثل متابعة

function callback(){console.log("i am done");}

["a", "b", "c"].forEach(function(item, index, array){
    //code here
    if(i == array.length -1)
    callback()
}






نأمل أن هذا سوف يحل مشكلتك ، وعادة ما أعمل مع هذا عندما أحتاج إلى تنفيذ forEach مع المهام غير المتزامنة في الداخل.

foo = [a,b,c,d];
waiting = foo.length;
foo.forEach(function(entry){
      doAsynchronousFunction(entry,finish) //call finish after each entry
}
function finish(){
      waiting--;
      if (waiting==0) {
          //do your Job intended to be done after forEach is completed
      } 
}

مع

function doAsynchronousFunction(entry,callback){
       //asynchronousjob with entry
       callback();
}





Links