2013-12-12 8 views
7

कभी-कभी मुझे AJAX को एक विशाल JSON पेलोड (~ 20MB) करना पड़ता है। इस प्रक्रिया के दौरान ऐसा लगता है जैसे ब्राउज़र विंडो लगातार लोड हो रही है (नवीनतम क्रोम, विंडोज 8.1)। उपयोगकर्ता लिंक पर चीजों पर क्लिक कर सकता है, लेकिन ब्राउज़र वास्तव में उन लिंक पर नहीं जायेगा जब तक AJAX अनुरोध पूरा नहीं हो जाता है। यह एक समस्या हो सकती है क्योंकि यदि आप ऐसे पृष्ठ पर जाते हैं जिसके लिए ऐसे AJAX कॉल की आवश्यकता होती है, तो इसे नेविगेट करना मुश्किल होता है। दुर्भाग्य से इस समय मैं पेलोड के आकार को कम नहीं कर सकता (मैं ग्राफ लोड कर रहा हूं, और कभी-कभी ग्राफ सैकड़ों हजारों नोड्स और किनारों पर होते हैं)।अनइंटरप्टेबल AJAX अनुरोध

कोई विचार क्यों ब्राउज़र नेविगेट नहीं करेगा (भले ही ब्राउजर उत्तरदायी है)? और, यदि संभव हो, तो कोई संभावित समाधान? धन्यवाद!

+1

क्या आपने अपने JSON को टुकड़ों में तोड़ने के बारे में सोचा है? आप इसे BinaryJS जैसे कुछ स्ट्रीमिंग और उन एक्सटेंशन में से किसी एक का उपयोग करके भी देख सकते हैं जो "जेएसओएन स्ट्रीमिंग" की अनुमति देता है, जहां आप डाउनलोड करने के दौरान जारी किए गए JSON ऑब्जेक्ट के तत्वों तक पहुंच सकते हैं। – Brad

+2

क्या आप सिंक्रोनस AJAX का उपयोग कर रहे हैं? यदि ऐसा है, ** ** ऐसा करना बंद करो। – Pointy

+1

विचार करें: * JSON को तोड़ना * एक्स से डेटा बड़ा होने पर अपलोड करने के लिए एक अलग पृष्ठ खोलना * अधिक आकार-कुशल प्रारूप के रूप में अपलोड करें? – Kroltan

उत्तर

3

मुझे नहीं पता कि आप जिस तकनीकी समस्या का सामना कर रहे हैं उसे कैसे हल किया जाए। हालांकि यह अभी भी उपयोगी हो सकता है। Google या फेसबुक पर विचार करें जहां आप अपने पूरे इतिहास को अपने सभी इतिहास और फ़ोटो के साथ संग्रह के रूप में डाउनलोड कर सकते हैं। इस पर एक नोट लें कि वे इसे कैसे करते हैं (AJAX कॉल के माध्यम से नहीं)। मेरा मानना ​​है कि उन्होंने आपके जैसी ही समस्याओं के कारण इस तरह से चुना है। बस कुछ सोचने के लिए।

3

मुझे कई महीने पहले इसी तरह की समस्या का सामना करना पड़ा। मुझे एक समाधान मिला जो setTimeout() का उपयोग करता है, जो ब्राउज़र ईवेंट कतार में एक अलग घटना बनाता है। यह मूल रूप से मैंने किया है:

jQuery(document).ready(function() { 

    setTimeout(function() { 

    $.ajax({ 
     url: "/longAjaxCall", 
     dataType: "json" 
    }).done(function() { 
     // do whatever ... 
    }); 

    }, 0); 

}); 

सुनिश्चित नहीं है कि आप jQuery का उपयोग कर रहे हैं या नहीं, लेकिन मूलभूत सिद्धांत समान है।

6

मैं HTML5 Web Worker का उपयोग करने का सुझाव दूंगा। ब्राउज़र समर्थन बहुत अच्छा नहीं है, खासकर आईई के लिए।

वेब कर्मचारी गैर-अवरुद्ध हैं, जिसका अर्थ है कि आप दो स्क्रिप्ट को एक साथ चला सकते हैं। जब आप पृष्ठभूमि में AJAX कॉल कर रहे हों तो यह आपके डोम को खाली कर देना चाहिए।

Here is one article I could find on using web workers with an AJAX call.

3

मैं शुरू में टुकड़ों में डेटा को विभाजित करने के लिए एक MD5 sum और एक chunk number भेजना होगा। और मैं js स्क्रिप्ट बनाउंगा जो धीरे-धीरे उनसे पूछा गया था। फिर इसमें शामिल हों, बाद में जांचें कि पूरा डेटा सही तरीके से भेजा गया था, और अंत में इसका उपयोग करें।

0

केवल दो चीजें जिनके बारे में मैं सोच सकता हूं वह यह है कि आपके AJAX कॉल के ऊपर पहले से ही कई लोगों ने कहा है कि आप उस ब्राउज़र के लिए उपलब्ध सभी समानांतर http कनेक्शन थ्रेड का उपयोग कर सकते हैं। AJAX कॉल एक को अवरुद्ध कर रहा है ताकि अन्य इंटरैक्शन के आधार पर आप उपयोगकर्ताओं को ऐसा करने की इजाजत दे सकें, यह हो सकता है कि आप पृष्ठभूमि में छवियों और स्क्रिप्ट को डाउनलोड कर रहे हैं और प्रभावी ढंग से उपयोगकर्ता को आगे बढ़ने तक रोकते हैं।

20 एमबी वास्तव में एक बड़ा हिस्सा है इसलिए मैं दूसरों से भी सहमत हूं कि यदि आपको संभव हो तो आपको प्राप्त करने के वैकल्पिक तरीकों का पता लगाना चाहिए।