আমি আজাক্স অবজেক্টটি নির্মাণে বাধা দেওয়ার প্রায় তিনটি পৃথক উপায়ে চেষ্টা করেছি:
- আমার প্রথম প্রচেষ্টা ব্যবহৃত
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 );