मैंने अजाक्स वस्तु के निर्माण में अवरोधन के तीन अलग-अलग तरीकों की कोशिश की:
- मेरा पहला प्रयास था
xhrFields
, लेकिन वह केवल एक श्रोता के लिए अनुमति देता है, केवल डाउनलोड (अपलोड नहीं) प्रगति के लिए संलग्न करता है, और अनावश्यक प्रतिलिपि-और-पेस्ट की तरह लगता है की आवश्यकता है।
- मेरे दूसरे प्रयास
progress
ने लौटे वादे के लिए एक फ़ंक्शन संलग्न किया , लेकिन मुझे अपने स्वयं के हैंडलर्स को बनाए रखना था। मुझे हैंडलर संलग्न करने के लिए एक अच्छी वस्तु नहीं मिली क्योंकि एक जगह मैं एक्सएचआर तक पहुंच सकता हूं और दूसरा मैं jQuery के एक्सएचआर तक पहुंच सकता हूं, लेकिन मुझे कभी भी स्थगित ऑब्जेक्ट (केवल इसका वादा) तक पहुंच नहीं थी।
- मेरे तीसरे प्रयास ने मुझे हैंडलर संलग्न करने के लिए एक्सएचआर के लिए सीधी पहुंच दी, लेकिन फिर से बहुत कॉपी-और-पेस्ट कोड की आवश्यकता थी।
- मैंने अपने तीसरे प्रयास को लपेट लिया और
ajax
अपने साथ jQuery का स्थान ले लिया । एकमात्र संभावित कमी यह है कि अब आप अपनी xhr()
सेटिंग का उपयोग नहीं कर सकते । आप यह देखने के लिए जाँच कर सकते हैं कि options.xhr
कोई फ़ंक्शन है या नहीं।
मैं वास्तव में अपने promise.progress
फ़ंक्शन को कॉल करता हूं, xhrProgress
ताकि बाद में मुझे आसानी से मिल सके। आप अपने अपलोड को अलग करने और श्रोताओं को डाउनलोड करने के लिए इसे कुछ और नाम देना चाह सकते हैं। मुझे उम्मीद है कि इससे किसी को मदद मिलेगी भले ही मूल पोस्टर को पहले से ही वह मिल गया हो, जिसकी उसे जरूरत थी।
(function extend_jQuery_ajax_with_progress( window, jQuery, undefined )
{
var $originalAjax = jQuery.ajax;
jQuery.ajax = function( url, options )
{
if( typeof( url ) === 'object' )
{options = url;url = undefined;}
options = options || {};
// Instantiate our own.
var xmlHttpReq = $.ajaxSettings.xhr();
// Make it use our own.
options.xhr = function()
{return( xmlHttpReq );};
var $newDeferred = $.Deferred();
var $oldPromise = $originalAjax( url, options )
.done( function done_wrapper( response, text_status, jqXHR )
{return( $newDeferred.resolveWith( this, arguments ));})
.fail( function fail_wrapper( jqXHR, text_status, error )
{return( $newDeferred.rejectWith( this, arguments ));})
.progress( function progress_wrapper()
{
window.console.warn( "Whoa, jQuery started actually using deferred progress to report Ajax progress!" );
return( $newDeferred.notifyWith( this, arguments ));
});
var $newPromise = $newDeferred.promise();
// Extend our own.
$newPromise.progress = function( handler )
{
xmlHttpReq.addEventListener( 'progress', function download_progress( evt )
{
//window.console.debug( "download_progress", evt );
handler.apply( this, [evt]);
}, false );
xmlHttpReq.upload.addEventListener( 'progress', function upload_progress( evt )
{
//window.console.debug( "upload_progress", evt );
handler.apply( this, [evt]);
}, false );
return( this );
};
return( $newPromise );
};
})( window, jQuery );