jQuery আজাক্স (jsonp) একটি সময়সীমা উপেক্ষা করে এবং ত্রুটির ঘটনাকে আগুন দেয় না


89

কিছু বেসিক ত্রুটি পরিচালনা পরিচালনা করতে, আমি কোডের টুকরোটি পুনরায় লিখতে চেয়েছিলাম যা ফ্ল্যাঙ্কার থেকে কিছু ছবির টানতে jQuery এর get .getJSON ব্যবহার করেছিল। এটি করার কারণটি হ'ল get .getJSON ত্রুটি পরিচালনা করতে বা টাইমআউটগুলি নিয়ে কাজ করে না।

যেহেতু get .getJSON কেবলমাত্র একটি মোড়ক aj .আজাক্স আমি জিনিসটি পুনরায় লেখার এবং আশ্চর্য অবাক করার সিদ্ধান্ত নিয়েছি, এটি নির্দোষভাবে কাজ করে।

এখন মজা শুরু যদিও। আমি যখন ইচ্ছাকৃতভাবে 404 (ইউআরএল পরিবর্তন করে) সৃষ্টি করি বা নেটওয়ার্ককে সময়সীমা অতিক্রম করার জন্য করি (ইন্টারভ্যুবগুলিতে আবদ্ধ না হয়ে) ত্রুটি ঘটায় তা মোটেও আগুন হয় না। আমি কী ভুল করছি তা নিয়ে আমার ক্ষতি হচ্ছে। সাহায্য অনেক প্রশংসা করা হয়।

কোডটি এখানে:

$(document).ready(function(){

    // var jsonFeed = "http://api.flickr.com/services/feeds/photos_public.gne"; // correct URL
    var jsonFeed = "http://api.flickr.com/services/feeds/photos_public.gne_______"; // this should throw a 404

    $.ajax({
        url: jsonFeed,
        data: { "lang" : "en-us",
                "format" : "json",
                "tags" : "sunset"
        },
        dataType: "jsonp",
        jsonp: "jsoncallback",
        timeout: 5000,
        success: function(data, status){
            $.each(data.items, function(i,item){
                $("<img>").attr("src", (item.media.m).replace("_m.","_s."))
                          .attr("alt", item.title)
                          .appendTo("ul#flickr")
                          .wrap("<li><a href=\"" + item.link + "\"></a></li>");
                if (i == 9) return false;
            });
        },
        error: function(XHR, textStatus, errorThrown){
            alert("ERREUR: " + textStatus);
            alert("ERREUR: " + errorThrown);
        }
    });

});

আমি যোগ করতে চাই যে jQuery সংস্করণ 1.4.2 এ ছিল যখন এই প্রশ্নটি জিজ্ঞাসা করা হয়েছিল

উত্তর:


86

jQuery 1.5 এবং উচ্চতর JSONP অনুরোধগুলির সাথে ত্রুটি পরিচালনা করার জন্য আরও ভাল সমর্থন করে। তবে আপনার $.ajaxপরিবর্তে পদ্ধতিটি ব্যবহার করা দরকার $.getJSON। আমার জন্য, এটি কাজ করে:

var req = $.ajax({
    url : url,
    dataType : "jsonp",
    timeout : 10000
});

req.success(function() {
    console.log('Yes! Success!');
});

req.error(function() {
    console.log('Oh noes!');
});

সময়সীমাটি মনে হয় কৌশলটি করেছে এবং ত্রুটি হ্যান্ডলারকে কল করবে, যখন 10 সেকেন্ডের পরে কোনও সফল অনুরোধ নেই।

আমি এই বিষয়ে একটি সামান্য ব্লগপোস্ট করেছি।


23
আমি এই মুহুর্তে বিরক্ত হয়েছি যে আমি 2 দিনের জন্য এই সমস্যার বিরুদ্ধে মাথা ঘুরিয়েছি এবং স্ট্যাকওভারফ্লোতে কিছুটা অস্পষ্ট অনুসন্ধান লাগে এটি খুঁজে পেতে আমাকে ক্রস-ডোমেন অনুরোধে একটি সময়সীমা যুক্ত করতে হবে যাতে ত্রুটিটি আগুনে ফেলা যায়। কীভাবে jQuery ডকুমেন্টেশনে এটি উল্লেখ করা যায় না? ক্রস-ডোমেন jsonp অনুরোধ কি সত্যিই অস্বাভাবিক? যাই হোক না কেন, আপনাকে ধন্যবাদ, ধন্যবাদ, আপনাকে ধন্যবাদ। +1
ক্রিসিকিয়ান

এই সমাধানের সাথে আমি স্থিতি কোডটি পেতে পারি না, পরিবর্তে আমি "টাইমআউট" পাই। সুতরাং আসল ত্রুটিটি কী তা আমি জানি না এবং এটির সম্পত্তি হ্যান্ডেল করতে পারি না।
টার্লগ

10
@ টারলগ: এটি যৌক্তিক। জেএসএনপি অনুরোধগুলি নেটিভ অ্যাজাক্স অনুরোধ নয়, এগুলি কেবল জাভাস্ক্রিপ্ট <script>ট্যাগ যা গতিশীলভাবে inোকানো হয় । একমাত্র আপনি যা জানতে পারেন তা হ'ল একটি অনুরোধ ব্যর্থ হয়েছে, স্থিতি কোড কী ছিল তা নয়। আপনি যদি স্থিতি কোড পেতে চান তবে আপনার traditionalতিহ্যবাহী আজাক্স অনুরোধ বা অন্যান্য ক্রস-ডোমেন কৌশলগুলি ব্যবহার করতে হবে।
হুস্কি

4
@ হুস্কি যেমন বলেছে, জেএসএনপি-র সাথে আপনার স্ট্যাটাস কোড থাকতে পারে না এবং আমি বিশ্বাস করি যে এজন্য আপনার এড়াতে চেষ্টা করা উচিত। ত্রুটি পাওয়ার একমাত্র উপায় হ'ল সময়সীমা আউট করা। এটি jQuery ডকুমেন্টেশনে (আরও অনেক বিষয় হিসাবে) আরও ভালভাবে ব্যাখ্যা করা উচিত।
আলেজান্দ্রো গার্সিয়া ইগলেসিয়াস

67

এটি jQuery এ নেটিভ jsonp প্রয়োগের সাথে একটি সীমাবদ্ধতা। নীচের পাঠ্যটি আইবিএম বিকাশকারী ওয়ার্কসের

জেএসএনপি হ'ল ম্যাসআপগুলি তৈরির জন্য একটি শক্তিশালী কৌশল, তবে দুর্ভাগ্যক্রমে, এটি আপনার ক্রস-ডোমেন যোগাযোগের সমস্ত প্রয়োজনের জন্য নিরাময় নয়। এর কিছু ত্রুটি রয়েছে যা উন্নয়নের সংস্থানগুলি প্রতিশ্রুতি দেওয়ার আগে অবশ্যই গুরুত্ব সহকারে বিবেচনা করা উচিত। প্রথম এবং সর্বাগ্রে, JSONP কলগুলির জন্য পরিচালনা করার কোনও ত্রুটি নেই। গতিশীল স্ক্রিপ্ট সন্নিবেশ কাজ করে, আপনি কল করা হবে; যদি না হয়, কিছুই হয় না। এটি নিঃশব্দে ব্যর্থ হয়। উদাহরণস্বরূপ, আপনি সার্ভার থেকে একটি 404 ত্রুটি ধরতে সক্ষম নন। আপনি অনুরোধ বাতিল বা পুনরায় চালু করতে পারবেন না। আপনি অবশ্য যুক্তিসঙ্গত সময়ের জন্য অপেক্ষা করতে পারেন। (ভবিষ্যতের jQuery সংস্করণগুলিতে JSONP অনুরোধগুলির জন্য একটি গর্ভপাত বৈশিষ্ট্য থাকতে পারে))

তবে গুগল কোডে একটি জসনপ প্লাগ-ইন উপলব্ধ রয়েছে যা ত্রুটি পরিচালনার জন্য সহায়তা সরবরাহ করে। শুরু করতে, কেবল আপনার কোডে নিম্নলিখিত পরিবর্তনগুলি করুন।

আপনি হয় এটি ডাউনলোড করতে পারেন, বা কেবল প্লাগ-ইনটিতে একটি স্ক্রিপ্ট রেফারেন্স যুক্ত করতে পারেন।

<script type="text/javascript" 
     src="http://jquery-jsonp.googlecode.com/files/jquery.jsonp-1.0.4.min.js">
</script>

তারপরে আপনার অজ্যাক্স কলটি নীচের মত প্রদর্শিত করুন:

$(function(){
    //var jsonFeed = "http://api.flickr.com/services/feeds/photos_public.gne"; // correct URL
    var jsonFeed = "http://api.flickr.com/services/feeds/photos_public.gne_______"; // this should throw a 404  
    $.jsonp({
        url: jsonFeed,
        data: { "lang" : "en-us",
                "format" : "json",
                "tags" : "sunset"
        },
        dataType: "jsonp",
        callbackParameter: "jsoncallback",
        timeout: 5000,
        success: function(data, status){
            $.each(data.items, function(i,item){
                $("<img>").attr("src", (item.media.m).replace("_m.","_s."))
                          .attr("alt", item.title)
                          .appendTo("ul#flickr")
                          .wrap("<li><a href=\"" + item.link + "\"></a></li>");
                if (i == 9) return false;
            });
        },
        error: function(XHR, textStatus, errorThrown){
            alert("ERREUR: " + textStatus);
            alert("ERREUR: " + errorThrown);
        }
    });
});

আপনি জোসে উত্তর দেওয়ার জন্য ধন্যবাদ! জিকুয়রিতে নেটিভ জসন্পের সীমাবদ্ধ বাস্তবায়নই আমি পরিবর্তে $ .জ্যাক্সের জন্য গিয়েছিলাম। যাইহোক, তবে মনে হয় সমস্যাটি isn't .getJSON aj .জ্যাক্সের চারপাশে একটি মোড়ক নয় তবে ডেটা টাইপ: জসনপ। এটা কি ঠিক?
মাটিজস

আজ অবধি সময় ছিল না। এটি তবে কাজ করে না। আমি একটি ত্রুটি পাচ্ছি, কিন্তু এটি প্রায়। ত্রুটি হিসাবে কী ত্রুটিটি অপ্রকাশিত তা আমি জানি না। আপাতত আমি $ .জ্যাক্স এবং ত্রুটির বার্তাগুলির অভাব বদ্ধ থাকব। জাভাস্ক্রিপ্ট আমার জন্য ওয়েবপৃষ্ঠার শীর্ষে একটি অতিরিক্ত স্তর। যদি ফ্লিকারটি ডাউন থাকে বা ত্রুটি বার্তাগুলি ছুঁড়ে মারে, তবে আমাদের এখনই এটির জন্য বাঁচতে হবে :) আপনার পরামর্শের জন্য ধন্যবাদ।
মতিজস

সুতরাং মূলত জোসনের পরামর্শে জসনপ প্লাগইনটি ব্যবহার করা উচিত, যদি সঠিকভাবে করা হয় তবে কাজ করা উচিত। আপাতত তবে আমি jQuery এর জন্য বেসিক জসন র‍্যাপারের সাথে লেগে থাকব।
মাটিজস

এটি আমার জন্য একবার উজ্জ্বলতার সাথে কাজ করেছিল আমি যখন jsonp এর ত্রুটি পরিচালনার অন্তর্নির্মিত সীমাবদ্ধতা দিয়ে দেয়ালে আঘাত করেছি
জেরেমি ফ্রে

7
অন্য টি বিকাশকারী এই টিপটি দ্বারা সংরক্ষিত। ধন্যবাদ!
চেস্টারব্র

12

আপনি jQuery 1.4 এর সাথে আটকে থাকলে একটি সমাধান:

var timeout = 10000;
var id = setTimeout( errorCallback, timeout );
$.ajax({
    dataType: 'jsonp',
    success: function() {
        clearTimeout(id);
        ...
    }
});

4
কেবল একটি মন্তব্য, এটি 1.4 এর সাথে আটকে থাকা লোকদের জন্য একটি বৈধ সমাধান, তবে আপনার টাইমআউট ভেরিয়েবলটি যথেষ্ট উচ্চতর সেট করুন, যাতে আপনার ধীর ওয়েবসার্ভিসেসে সমস্যা না হয় :)। উদাহরণস্বরূপ, আপনি যদি এটি এক সেকেন্ডে সেট করেন, তবে আপনি কী বলতে চাইছেন তা দেখতে পাচ্ছেন, ত্রুটি কলব্যাকটি ট্রিগার হয়ে যায়, যখন 1 সেকেন্ডের পরে আপনার কলটি এখনও পাওয়া যায় এবং সাফল্যের ফাংশনটিকে কল করে। সুতরাং এটি যথেষ্ট পরিমাণে যথেষ্ট সেট করার জন্য কেবল মনে রাখবেন
Sander

@ স্যান্ডার করুন সাফল্যের ফাংশনটি এমনকি যদি আপনি সেকেন্ডের 5 সেকেন্ডের সময়সীমা 10 সেকেন্ড পরে উত্তর পেয়ে থাকেন তবে ডাকা যেতে পারে। .abort()একটি সময়সীমা পেরোনোর ​​পরে একটি মুলতুবি jqXHR এ কল করা আরও ভাল উপায় হতে পারে।
মাটিজস

8

এটি jQuery এর একটি "জ্ঞাত" সীমাবদ্ধতা হতে পারে; তবে, এটি ভাল নথিভুক্ত বলে মনে হয় না। আমার সময়সীমা কেন কাজ করছে না তা বোঝার জন্য আমি আজ প্রায় 4 ঘন্টা ব্যয় করেছি।

আমি jquery.jsonp এ চলেছি এবং এটি একটি কবজ পছন্দ করে। ধন্যবাদ.


2

JQuery 1.5 হিসাবে সমাধান করা হয়েছে বলে মনে হচ্ছে। আমি উপরের কোডটি চেষ্টা করেছি এবং আমি কলব্যাক পেয়েছি।

আমি বলছি "বলে মনে হচ্ছে" কারণ jQuery.ajax () এর ত্রুটি কলব্যাকের ডকুমেন্টেশনটিতে এখনও নিম্নলিখিত নোট রয়েছে:

দ্রষ্টব্য: এই হ্যান্ডলারটি ক্রস-ডোমেন স্ক্রিপ্ট এবং জেএসএনপি অনুরোধের জন্য ডাকা হয় না।


1

জোসে বাসিলিওর উত্তরে উল্লিখিত jquery-jsonp jQuery প্লাগইনটি এখন গিটহাবে পাওয়া যাবে

দুর্ভাগ্যক্রমে ডকুমেন্টেশন কিছুটা স্পার্টান, তাই আমি একটি সহজ উদাহরণ প্রদান করেছি:

    $.jsonp({
        cache: false,
        url: "url",
        callbackParameter: "callback",
        data: { "key" : "value" },
        success: function (json, textStatus, xOptions) {
            // handle success - textStatus is "success"   
        },
        error: function (xOptions, textStatus) {
            // handle failure - textStatus is either "error" or "timeout"
        }
    });

গুরুত্বপূর্ণ কল back .jsonp () কলটিতে কলব্যাকের প্যারামিটার অন্তর্ভুক্ত করুন নাহলে আমি দেখতে পেয়েছি যে কলব্যাক ফাংশনটি কখনই সার্ভিস কলের ক্যোরি স্ট্রিংয়ের সাথে ইনজেকশনে পরিণত হয় না (বর্তমান জেউয়েরি-জসোনপ সংস্করণ ২.৪.০ হিসাবে)।

আমি জানি এই প্রশ্নটি পুরানো, তবে জেএসএনপি ব্যবহার করে ত্রুটি পরিচালনা করার বিষয়টি এখনও 'সমাধান করা হয়নি'। আশা করি এই আপডেটটি অন্যদের সহায়তা করবে কারণ এই প্রশ্নটি "জ্যাকিউরি জসনপ ত্রুটি পরিচালনা" এর জন্য গুগলের মধ্যে শীর্ষস্থানীয়-


সুন্দর সন্ধান, এবং আশ্চর্যজনক এই থ্রেডটি এখনও তিন বছর পরেও বেঁচে আছে ...
মাতিজস

1

স্ক্রিপ্টের অনার ইভেন্টটি শুনে কী হবে? আমার এই সমস্যাটি হয়েছিল এবং স্ক্রিপ্ট ট্যাগটি তৈরি হয়েছিল এমন জ্যাকোরির পদ্ধতিটি প্যাচ করে এটি সমাধান করেছি। কোডের আকর্ষণীয় বিটটি এখানে:

// Attach handlers for all browsers
script.onload = script.onreadystatechange = function( _, isAbort ) {

    if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {

        cleanup();

        // Callback if not abort
        if ( !isAbort ) {
            callback( 200, "success" );
        }
    }
};

/* ajax patch : */
script.onerror = function(){
    cleanup();

    // Sends an inappropriate error, still better than nothing
    callback(404, "not found");
};

function cleanup(){
    // Handle memory leak in IE
    script.onload = script.onreadystatechange = null;

    // Remove the script
    if ( head && script.parentNode ) {
        head.removeChild( script );
    }

    // Dereference the script
    script = undefined;
}

আপনি এই সমাধান সম্পর্কে কি মনে করেন? এটি কি সামঞ্জস্যতা সমস্যার কারণ হতে পারে?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.