यह पुराना सवाल है लेकिन मैं कुछ ऐसा ही करने की कोशिश कर रहा था। मुझे एन वर्कर्स को रखने की जरूरत है। वे एक वादे में संरचित हैं। मुझे स्कैन करने और देखने की आवश्यकता है कि क्या वे हल किए गए हैं, अस्वीकार किए गए हैं या अभी भी लंबित हैं। यदि हल किया जाता है, तो मुझे मूल्य की आवश्यकता है, यदि अस्वीकार किया गया है तो समस्या को ठीक करने या लंबित करने के लिए कुछ करें। यदि हल या अस्वीकार कर दिया गया है तो मुझे n चलते रहने के लिए एक और कार्य शुरू करने की आवश्यकता है। मैं Promise.all या Promise.race के साथ इसे करने का एक तरीका नहीं समझ सकता क्योंकि मैं एक सरणी में काम करने के वादे रखता हूं और उन्हें हटाने का कोई तरीका नहीं खोज सकता। तो मैं एक कार्यकर्ता बनाता हूं जो चाल करता है
मुझे एक वादा जनरेटर फ़ंक्शन की आवश्यकता है जो एक वादा लौटाता है जो आवश्यक के रूप में हल या अस्वीकार करता है। यह एक फ़ंक्शन द्वारा कहा जाता है जो यह पता लगाने के लिए रूपरेखा तैयार करता है कि वादा क्या कर रहा है।
जनरेटर के नीचे कोड में बस सेटटाइमआउट के आधार पर एक वादा वापस किया जाता है।
यह रहा
//argObj should be of form
// {succeed: <true or false, nTimer: <desired time out>}
function promiseGenerator(argsObj) {
let succeed = argsObj.succeed;
let nTimer = argsObj.nTimer;
return new Promise((resolve, reject) => {
setTimeout(() => {
if (succeed) {
resolve('ok');
}
else {
reject(`fail`);
}
}, nTimer);
})
}
function doWork(generatorargs) {
let sp = { state: `pending`, value: ``, promise: "" };
let p1 = promiseGenerator(generatorargs)
.then((value) => {
sp.state = "resolved";
sp.value = value;
})
.catch((err) => {
sp.state = "rejected";
sp.value = err;
})
sp.promise = p1;
return sp;
}
doWork वादे और उसके राज्य और वापस लौटे मूल्य वाली एक वस्तु देता है।
निम्न कोड एक लूप चलाता है जो राज्य का परीक्षण करता है और इसे चलाने वाले 3 श्रमिकों पर रखने के लिए नए श्रमिक बनाता है।
let promiseArray = [];
promiseArray.push(doWork({ succeed: true, nTimer: 1000 }));
promiseArray.push(doWork({ succeed: true, nTimer: 500 }));
promiseArray.push(doWork({ succeed: false, nTimer: 3000 }));
function loopTimerPromise(delay) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('ok');
}, delay)
})
}
async function looper() {
let nPromises = 3; //just for breaking loop
let nloop = 0; //just for breaking loop
let i;
//let continueLoop = true;
while (true) {
await loopTimerPromise(900); //execute loop every 900ms
nloop++;
//console.log(`promiseArray.length = ${promiseArray.length}`);
for (i = promiseArray.length; i--; i > -1) {
console.log(`index ${i} state: ${promiseArray[i].state}`);
switch (promiseArray[i].state) {
case "pending":
break;
case "resolved":
nPromises++;
promiseArray.splice(i, 1);
promiseArray.push(doWork({ succeed: true, nTimer: 1000 }));
break;
case "rejected":
//take recovery action
nPromises++;
promiseArray.splice(i, 1);
promiseArray.push(doWork({ succeed: false, nTimer: 500 }));
break;
default:
console.log(`error bad state in i=${i} state:${promiseArray[i].state} `)
break;
}
}
console.log(``);
if (nloop > 10 || nPromises > 10) {
//should do a Promise.all on remaining promises to clean them up but not for test
break;
}
}
}
looper();
नोड.जेएस में परीक्षण किया गया
BTW इस जवाब में इतना नहीं है, लेकिन इसी तरह के विषयों पर दूसरों में, मैं इसे नफरत करता हूं जब कोई कहता है कि "आप नहीं समझते" या "यह कैसे काम करता है" मैं आम तौर पर मान लेता हूं कि प्रश्नकर्ता को पता है कि वे क्या चाहते हैं। बेहतर तरीके से सुझाव देना शानदार है। वादे कैसे काम करते हैं, इसका एक रोगी स्पष्टीकरण भी अच्छा होगा।