2017-11-01 17 views
5

द्वारा ऑर्डर करने वाली वस्तुओं को शामिल करें मैं राशि के अनुसार नई वस्तुओं को जोड़ने के लिए इस फ़ंक्शन का उपयोग कर रहा हूं। इस समारोह को हर 30-50ms कहा जा रहा है।रखी गई राशि

var insertBefore = false; 
container.find('.roll-user-row[data-user-id="' + user_data.id + '"]').remove(); 

container.children().each(function() { 
    var betContainer = $(this), itemAmount = $(this).attr('data-amount'), betId = $(this).attr('data-user-id'); 
    if (itemAmount < betData.totalAmount) { 
     insertBefore = betContainer; 
     return false; 
    } 
}); 

if (insertBefore) { 
    $(template).insertBefore(container); 
} else { 
    container.prepend(template); 
} 

itemAmount = $(this).attr('data-amount'), पूर्णांक है betData.totalAmount भी interger है। और यदि संलग्न करना ± 300ms से धीमा हो जाता है - सबकुछ ठीक से काम करता है। तेजी से appending के मामले में मैं इस परिणाम मिलता है:

random order

और यहां तक ​​कि बंद नहीं thats कि मैं क्या चाहता हूँ - यादृच्छिक thats। इसे कैसे हल करें?

+0

क्या आप सूची में हर आइटम को हर समय सॉर्ट करने का इरादा रखते हैं? –

+0

i.e आपका उद्देश्य एक क्रमबद्ध सूची है? –

उत्तर

4

1. पुनर्रचना

सबसे पहले, return.each भीतर कॉलबैक काम नहीं करता। यह सिर्फ वर्तमान चक्र को तोड़ता है, सभी चक्र नहीं। यदि आप सिलस को बाधित करना चाहते हैं, तो आपको सरल फॉर-लूप और break कथन का उपयोग करना चाहिए। फिर, मैं शायद ही कभी संभवतः $() पर कॉल करने की अनुशंसा करता हूं, क्योंकि यह is expensive है। इसलिए मैं अपने समारोह के लिए निम्नलिखित रिफैक्टरिंग सुझाव है:

function run() { 
    container.find('.roll-user-row[data-user-id="' + user_data.id + '"]').remove(); 

    var children = container.children(); 
    for (var i = 0; i < children.length; i++) { 
    var betContainer = $(children[i]); // to cache children[i] wrapping 
    var itemAmount = betContainer.attr('data-amount'); 
    var betId = betContainer.attr('data-user-id'); 

    if (itemAmount < betData.totalAmount) { 
     $(template).insertBefore(container); 
     return; // instead of "break", less code for same logic 
    } 
    } 

    container.prepend(template); // would not be executed in case of insertBefore due to "return" 
} 

2. थ्रॉटलिंग

एक 50ms प्रक्रिया को दोहराते हैं, तो आप setInterval(run, 50) की तरह कुछ का उपयोग कर रहे चलाने के लिए। यदि आपको यह सुनिश्चित करने की आवश्यकता है कि run किया गया है और यह 300ms देरी है, तो आप केवल setInterval(run, 300) का उपयोग कर सकते हैं। लेकिन अगर प्रक्रिया एक तरीका है कि आप बदल नहीं सकते में initializes, और 50ms कि के लिए निश्चित अंतराल है, तो आप run बुला lodash throttle या jquery throttle plugin द्वारा की रक्षा कर सकते हैं:

var throttledRun = _.throttle(run, 300); // var throttledRun = $.throttle(300, run); 
setInterval(throttledRun, 50); 

setInterval सिर्फ उदाहरण के लिए है, तो आप की जरूरत है अपने पुनरावर्तक प्रारंभिक तर्क में थ्रॉटल संस्करण (throttledRun) के साथ अपने शुरुआती run को प्रतिस्थापित करें। इसका मतलब है कि run को तब तक निष्पादित नहीं किया जाएगा जब तक कि पिछले run निष्पादन के बाद 300ms अंतराल पारित नहीं हो जाता है।

+0

यह सही उत्तर की तरह दिखता है लेकिन मैं इसे सही नहीं चिह्नित कर सकता क्योंकि यह थ्रॉटल के साथ प्रतीक्षा करने की कतार बनाता है। और मुझे जो चाहिए वह वास्तविक समय अपडेट है क्योंकि सभी तत्वों को जोड़ने के लिए 15 सेकंड हैं।उन 15 सेकंड के बाद मुझे नए तत्वों को जोड़ने के बिना थ्रॉटल रद्द करना होगा, है ना? अगर मैं गलत हूं तो मेरा सुधार करें। – Sandra

+0

@ सांड्रा थ्रॉटलिंग सिर्फ अवांछित कॉल छोड़ देता है, यह कतार नहीं बनाता है। तो हमने कहा, असली समय यहाँ थक गया है। आप 'throttledRun.cancel()' द्वारा पिछली थ्रॉटल किए गए आमंत्रण को रद्द कर सकते हैं। बस इसे कहीं भी कॉल करें। इसके अलावा आप इसे डमी बनाने के लिए सभी प्रक्रियाओं को ओवरराइड कर सकते हैं: 'run = function() {वापसी शून्य; } 'या निवारक 'वापसी' के लिए एक शर्त जोड़ें या ... किसी भी उपयोग के मामले के लिए बहुत सारे तरीके हैं, केवल उपयोग के मामले को स्पष्ट करने की आवश्यकता है। – dhilt

+0

इसलिए मैंने इस विधि को आजमाया और अभी भी एक ही समस्या का सामना किया .. कॉलबैक 50 और ± 300ms के बीच यादृच्छिक समय सीमा में हैं। मदद के लिए धन्यवाद! – Sandra

2

मेरी समझ सही है, तो मैं केवल यहां दृष्टिकोण पोस्ट कर रहा हूं, तो मैं एक कोड पोस्ट करूंगा। पहली बात मेरे दिमाग में पढ़ने के लिए यह 'Virtual DOM' concept था। यहां आप क्या कर सकते हैं,

  1. ऑब्जेक्ट जैसे डेटा संरचना को बनाए रखने के लिए अत्यधिक लगातार यादृच्छिक फ़ंक्शन कॉल का उपयोग करें। डोम अपडेट पर भरोसा मत करो।

  2. फिर उस डेटा संरचना से अपने डीओएम को फिर से निकालने (या अपडेट) करने के लिए बहुत कम setInterval दोहराव वाली फ़ंक्शन कॉल का उपयोग करें।

मुझे यकीन है कि किसी भी कारण से यदि आप इस दृष्टिकोण नहीं ले जा सकते हैं नहीं कर रहा हूँ, लेकिन यह सबसे कारगर तरीका एक समय महत्वपूर्ण यूज-केस में डोम को संभालने के लिए किया जाएगा।

+0

"30ms लगातार फ़ंक्शन कॉल" असली चीज़ नहीं है, मैंने अभी इसे नाम दिया है। सर्वर पक्ष पर जो हुआ उसके आधार पर यह वास्तव में सॉकेट एमिट बैकएंड से है। और यही कारण है कि यह 30-50-100ms है - दूसरी तरफ यादृच्छिक। – Sandra

+0

इससे कोई फर्क नहीं पड़ता, यादृच्छिक या नहीं, आप डेटा संरचना को साफ़ रूप से अपडेट कर सकते हैं। फिर दृश्य उत्पन्न करने के लिए इसका उपयोग करें। – nipunasudha

संबंधित मुद्दे