jQuery.ajax পরিচালনা পরিচালনা প্রতিক্রিয়া: "সাফল্য:" বনাম "। সম্পন্ন"?


309

আমি এখন কয়েক সপ্তাহ ধরে jQuery এবং AJAX এর সাথে কাজ করছি এবং একবার কল হয়ে গেলে স্ক্রিপ্টটি 'চালিয়ে' যেতে দুটি ভিন্ন উপায় দেখেছি: success:এবং .done

JQuery ডকুমেন্টেশন থেকে সংক্ষিপ্তসার থেকে আমরা পাই:

.ডোন (): বিবরণ: যখন ডিফার্ড অবজেক্টটি সমাধান হয় তখন কল করার জন্য হ্যান্ডলার যুক্ত করুন।

সাফল্য: (.ajax () বিকল্প): অনুরোধটি সফল হলে একটি ফাংশন ডেকে আনা হবে।

সুতরাং, উভয়ই এএএএক্সএক্স কলটি সম্পন্ন / সমাধান হওয়ার পরে কিছু করে। আমি কি এক বা অন্যটি এলোমেলোভাবে ব্যবহার করতে পারি? পার্থক্য কী এবং যখন অন্যটির পরিবর্তে একটি ব্যবহৃত হয়?

উত্তর:


469

successআজম্যাক্স কল হিসাবে একটি বিকল্প হিসাবে সংজ্ঞায়িত jQuery এর সাফল্য কলব্যাকের চিরাচরিত নাম। যাইহোক, যেহেতু $.Deferredsআরও বেশি পরিশীলিত কলব্যাক doneবাস্তবায়ন এবং সাফল্য কলব্যাকগুলি বাস্তবায়নের জন্য পছন্দসই উপায়, কারণ এটি যে কোনওটিকেই বলা যেতে পারে deferred

উদাহরণস্বরূপ, সাফল্য:

$.ajax({
  url: '/',
  success: function(data) {}
});

উদাহরণস্বরূপ, সম্পন্ন:

$.ajax({url: '/'}).done(function(data) {});

সুন্দর জিনিসটি doneহ'ল এর রিটার্ন মান $.ajaxএখন একটি মুলতুবি প্রতিশ্রুতি যা আপনার আবেদনের অন্য কোথাও আবদ্ধ হতে পারে। সুতরাং আসুন আমরা কিছু আলাদা জায়গা থেকে এই এজাক্স কল করতে চান তা যাক। বরং ফাংশন এই Ajax কল করে তোলে করার জন্য একটি বিকল্প হিসেবে আপনার সাফল্য ফাংশনে ক্ষণস্থায়ী চেয়ে, আপনি শুধু ফাংশন রিটার্ন থাকতে পারে $.ajaxনিজেই এবং বাঁধুন সঙ্গে আপনার callbacks done, fail, then, অথবা যা খুশি। দ্রষ্টব্য যে alwaysএকটি কলব্যাক যা অনুরোধটি সফল হয় বা ব্যর্থ হয় কিনা তা চলবে। doneশুধুমাত্র সাফল্যের উপর ট্রিগার করা হবে।

উদাহরণ স্বরূপ:

function xhr_get(url) {

  return $.ajax({
    url: url,
    type: 'get',
    dataType: 'json',
    beforeSend: showLoadingImgFn
  })
  .always(function() {
    // remove loading image maybe
  })
  .fail(function() {
    // handle request failures
  });

}

xhr_get('/index').done(function(data) {
  // do stuff with index data
});

xhr_get('/id').done(function(data) {
  // do stuff with id data
});

রক্ষণাবেক্ষণের ক্ষেত্রে এটির একটি গুরুত্বপূর্ণ সুবিধা হ'ল আপনি একটি অ্যাপ্লিকেশন-নির্দিষ্ট ফাংশনে আপনার এজাক্স প্রক্রিয়াটি আবদ্ধ করেছেন। আপনি যদি সিদ্ধান্ত $.ajaxনেন যে ভবিষ্যতে আপনার কলটি আলাদাভাবে পরিচালনা করতে হবে, বা আপনি একটি আলাদা এজ্যাক্স পদ্ধতি ব্যবহার করেন, বা আপনি jQuery থেকে দূরে সরে গেছেন, আপনাকে কেবলমাত্র xhr_getসংজ্ঞাটি পরিবর্তন করতে হবে (প্রতিশ্রুতি ফেরানোর বিষয়ে নিশ্চিত হওয়া বা কমপক্ষে কোনও doneপদ্ধতি, উপরের উদাহরণের ক্ষেত্রে)। অ্যাপ্লিকেশন জুড়ে অন্যান্য সমস্ত উল্লেখ একই থাকতে পারে।

আপনি আরও অনেকগুলি (অনেক বেশি কুলার) কাজ করতে পারেন $.Deferredযার মধ্যে pipeএকটি হ'ল $.ajaxঅনুরোধটি স্বয়ংক্রিয়ভাবে সাফল্য প্রাপ্ত হয়েও সার্ভারের দ্বারা প্রতিবেদন করা একটি ত্রুটির ব্যর্থতা ট্রিগার করতে ব্যবহার করা । উদাহরণ স্বরূপ:

function xhr_get(url) {

  return $.ajax({
    url: url,
    type: 'get',
    dataType: 'json'
  })
  .pipe(function(data) {
    return data.responseCode != 200 ?
      $.Deferred().reject( data ) :
      data;
  })
  .fail(function(data) {
    if ( data.responseCode )
      console.log( data.responseCode );
  });
}

xhr_get('/index').done(function(data) {
  // will not run if json returned from ajax has responseCode other than 200
});

$.Deferredএখানে আরও পড়ুন : http://api.jquery.com/category/deferred-object/

দ্রষ্টব্য : jQuery 1.8 হিসাবে, ঠিক একইভাবে pipeব্যবহারের পক্ষে অবমুক্ত করা হয়েছে then


2
আমি আশ্চর্য হই যে কীভাবে success:/ .done()এর ইন্টারঅ্যাকশনগুলি সংজ্ঞায়িত করা হয়, যদি তা হয় তবে। উদাহরণস্বরূপ, আজকাল success:প্রথম হিসাবে কার্যকর করা হয় .done()?

6
আপনি বলতে চাইছেন যদি আপনার উভয় success:এবং .doneএকটি এজ্যাক্স কল রয়েছে? ভাল প্রশ্ন. যেহেতু অন্যান্য সমস্ত কলব্যাকগুলি সেটিকে আবদ্ধ করার জন্য বলা হয়েছে, আমার অনুমান হ্যাঁ, successকেবল প্রথমে বলা হয়।
গৌরব

1
খুব সুন্দর পোস্ট! বিটিডাব্লু, পাইপ কলব্যাকে, আপনি কি জেএকএক্সএইচআরআর প্যারামিটারের সাথে পাইপ ফাংশনটি কল করবেন না যাতে স্থিতির প্রতিক্রিয়া যাচাই করা যায়? উদাঃ। পাইপ (ফাংশন (ডেটা, টেক্সটস্ট্যাটাস, জকিএক্সএইচআর)) {যদি (jqXHR.status == 200) {...
ইডার

@ ইডার এই দৃশ্যের সাথে আমি যে দৃশ্যের সাথে সম্বোধন করছি pipeতা হ'ল অনুরোধটি নিজেই সফল হয় তবে সার্ভারে থাকা স্ক্রিপ্টটি আপনি যা খুঁজছিলেন তা ফেরত দেয় না। আপনি প্রকৃত 404 বা 500 বা সার্ভার সাইডে যা কিছু ফেলে দিতে চান না কারণ আপনি HTTP প্রতিক্রিয়া এবং অ্যাপ্লিকেশন প্রতিক্রিয়াগুলির মধ্যে অর্থপূর্ণভাবে আলাদা করতে চান want জেএসএনে একটি প্রতিক্রিয়া কোড সেট করা এবং তারপরে pipeএইভাবে ব্যবহার করা আপনাকে আরও উপকারের মাধ্যমে বিভিন্ন ধরণের ত্রুটিগুলি পরিচালনা করতে দেয়।
গ্লোথথো

প্রতিশ্রুতি ব্যবহারের আরেকটি গুরুত্বপূর্ণ সুবিধা হ'ল আপনার কোডটি আরও বেশি পঠনযোগ্য হয়ে যায় এবং আপনি 'কলব্যাক হেল্ক' এড়ান। এটি স্পষ্টত সত্য যখন আপনার একাধিক কলব্যাক থাকে যা আপনি পূর্ববর্তী সমাপ্তির পরে প্রতিটি চালাতে চান। প্রতিশ্রুতি সহ এটি myPromiseCall. মতো দেখাবে (তারপর) .. তারপর (..) সাফল্যের বিকল্পের সাথে ব্যবহৃত কলব্যাকের নেস্টেড জটিল কাঠামোর পরিবর্তে।
BornToCode

5

async: falseআপনার অজ্যাক্সে আপনার যদি প্রয়োজন হয় তবে আপনার successপরিবর্তে ব্যবহার করা উচিত .done। অন্যথায় আপনি ব্যবহার ভাল .done। এটি jQuery অফিসিয়াল সাইট থেকে :

JQuery 1.8 হিসাবে, async এর ব্যবহার : jqXHR (e। ডিফার্ড) সহ মিথ্যা হ্রাস করা হয়েছে; আপনাকে অবশ্যই jqXHR.done () এর মতো jqXHR অবজেক্টের সম্পর্কিত পদ্ধতির পরিবর্তে সাফল্য / ত্রুটি / সম্পূর্ণ কলব্যাক বিকল্পগুলি ব্যবহার করতে হবে


কে উল্লেখ async:false?
লিয়াম

$.ajax({ url: req_url, ..., async: false, success: function (result, status, req) { }, error: function (jqXHR, status) { } });
আমিরহসিন ম্যানিয়ান

0

JQuery ডকুমেন্টেশন থেকে

JqXHR অবজেক্টগুলি $.ajax()jQuery 1.5 হিসাবে প্রত্যাবর্তিত প্রতিশ্রুতি ইন্টারফেস প্রয়োগ করে প্রতিশ্রুতির সমস্ত বৈশিষ্ট্য, পদ্ধতি এবং আচরণ দেয় ( আরও তথ্যের জন্য ডিফার্ড অবজেক্ট দেখুন)। এই পদ্ধতিগুলি এক বা একাধিক ফাংশন আর্গুমেন্ট নেয় যা যখন $.ajax()অনুরোধটি শেষ হয় তখন ডাকা হয় । এটি আপনাকে একক অনুরোধে একাধিক কলব্যাক বরাদ্দ করতে এবং এমনকি অনুরোধটি শেষ হওয়ার পরে কলব্যাকগুলি বরাদ্দ করতে দেয়। (অনুরোধ ইতিমধ্যে সম্পূর্ণ হলে, কলব্যাকটি অবিলম্বে বরখাস্ত করা হবে)) jqXHR অবজেক্টের উপলব্ধ প্রতিশ্রুতি পদ্ধতিগুলির মধ্যে রয়েছে:

jqXHR.done(function( data, textStatus, jqXHR ) {});

সাফল্য কলব্যাক বিকল্পের বিকল্প নির্মাণ, deferred.done()প্রয়োগের বিশদটি দেখুন।

jqXHR.fail(function( jqXHR, textStatus, errorThrown ) {});

ত্রুটি কলব্যাক অপশনের বিকল্প কনস্ট্রাক্ট, .fail()পদ্ধতিটি অবচিত। অরর () পদ্ধতিটি প্রতিস্থাপন করে। প্রয়োগের বিশদগুলির জন্য ডিফারড.ফাইল () দেখুন।

jqXHR.always(function( data|jqXHR, textStatus, jqXHR|errorThrown ) { }); 

(jQuery 1.6 যোগ করা হয়েছে) সম্পূর্ণ কলব্যাক বিকল্পে একটি বিকল্প নির্মাণ, .always()পদ্ধতি অবচিত .complete()পদ্ধতিটি প্রতিস্থাপন করে ।

একটি সফল অনুরোধের প্রতিক্রিয়া হিসাবে .done(), ফাংশনটির যুক্তিগুলি হ'ল ডেটা, টেক্সটস্ট্যাটাস এবং jqXHR অবজেক্টের মতো as ব্যর্থ অনুরোধের জন্য আর্গুমেন্টগুলি .fail()হ'ল: jqXHR অবজেক্ট, টেক্সটস্ট্যাটাস এবং ত্রুটি-ট্রাউন পড়ুন deferred.always()বাস্তবায়ন বিস্তারিত জানার জন্য।

jqXHR.then(function( data, textStatus, jqXHR ) {}, function( jqXHR, textStatus, errorThrown ) {});

(JQuery 1.8 হিসাবে) অন্তর্নিহিত প্রতিশ্রুতি হেরফের করার অনুমতি দেয় .done()এবং .fail()পদ্ধতিগুলির কার্যকারিতা অন্তর্ভুক্ত করে । .then()বাস্তবায়নের বিশদ জন্য মুলতুবি দেখুন।

অসমর্থনের বিজ্ঞপ্তি:jqXHR.success() , jqXHR.error(), এবং jqXHR.complete()callbacks jQuery এর 3.0 এর হিসাবে সরিয়ে ফেলা হয়। আপনি ব্যবহার করতে পারেন jqXHR.done(), jqXHR.fail()এবং jqXHR.always()পরিবর্তে।

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