मेरे पास एक फ़ंक्शन है, जो ऐसा लगता है।"फ्रीजिंग" ब्राउज़र को रोकने के लिए वादा का उपयोग करने के लिए प्रत्येक के लिए फिर से लिखना कैसे करें?
function() {
longArray.forEach(element => doSomethingResourceIntensive(element))
}
क्योंकि सरणी लंबी है और फ़ंक्शन थोड़ा संसाधन गहन है, यह ब्राउज़र को फ्रीज करता है।
अब मैं वादा का उपयोग करके इसे फिर से लिखना चाहता हूं, इसलिए यह वही काम करता है, बस ब्राउज़र को ठंडा नहीं करता है, और मैं समाधान को सुरुचिपूर्ण और "ES6-y" बनाना चाहता हूं; आदर्श रूप से, जब सभी पुनरावृत्तियों को समाप्त किया गया तो कार्य वादा वापस कर देगा।
मुझे this question मिला, जहां इसे सेटटाइमआउट का उपयोग करने के साथ निपटाया गया है, लेकिन यह थोड़ा "un-ES6-y" लगता है, और यह वादा नहीं करता है।
मैं
function() {
return Promise.all(longArray.map(element =>
Promise.resolve().then(() => doSomethingResourceIntensive(element))
)
}
ऐसा नहीं कर सकते, क्योंकि मैं लगातार वादों को चलाने के लिए की जरूरत है और मुझे यकीन है कि अगर यह वहाँ क्या होगा नहीं हूँ।
क्या आपने 'setTimeout' का उपयोग करने और अंदर लूप को निष्पादित करने का प्रयास किया था? – jeerbl
[वेब श्रमिक] (https://developer.mozilla.org/en-US/docs/Web/API/Worker) के बारे में क्या? – Andreas
वादा एसिंक्रोनस ऑपरेशंस से निपटने का एक तरीका है, वे ब्राउज़र को फ्रीज करने से लंबे समय तक चलने वाली जावास्क्रिप्ट को जादुई रूप से रोक नहीं पाएंगे। आपको अपने कोड को गैर-अवरुद्ध तरीके से फिर से लिखना होगा, उदाहरण के लिए वेब श्रमिकों के साथ या 'setTimeout'/'setImmediate' के साथ। –