جافا سكريبت - تشغيل وعد واحد فقط لعدة طلبات
أريد أن تجعل الكائنات تطلب وعد JavaScript، لكنني لا أريد أن تنشئ وعودًا منفصلة. المنطق الذي أريد تحقيقه هو كما يلي - التحقق مما إذا كان الوعد قيد الانتظار، وفقط إذا لم يكن كذلك، إنشاء وعد جديد. هل هذا ممكن؟ وفقًا للتوثيق، لا يمكنني التحقق من حالة الوعد، يمكنني فقط التعامل معه بعد الوفاء به، لكنني لا أريد استدعاء المعالجات لكل طلب وعد، ولا أريد تشغيل عدة وعود إذا كان بإمكان رد اتصال وعد واحد الاستجابة لجميع الطلبات السابقة...
المشكلة التي أحاول حلها بهذه الطريقة هي جلب البيانات من خادم خارجي وبثها من خلال حدث إلى عدة كائنات بعد استلامها.
الإجابة رقم 1
بالتأكيد، هذا سهل جدًا للقيام به
var _p = null; // just a cache
function batchRequests(fn){
if(_p != null) return _p; // if we have an in-flight request, return it
_p = fn(); // otherwise start a new action
_p.then(function(){ _p = null; }, // delete cache on resolve
function(){ _p = null; }); // even on failure
return _p; // return the new in-flight request
}
الذي يتيح لك القيام بـ:
function delay(){ // just for example, simulate a request
return new Promise(function(resolve){ setTimeout(resolve, 1000); });
}
var batched = function(){ return batchRequests(delay); };
batched().then(function(){ console.log("All these"); });
batched().then(function(){ console.log("execute after"); });
batched().then(function(){ console.log("one second, at the same time"); });
