jQuery মুলতুবি এবং প্রতিশ্রুতি -। থেন () বনাম। সম্পন্ন ()


473

আমি jQuery স্থগিত এবং প্রতিশ্রুতি সম্পর্কে পড়া এবং আমি সফল কলব্যাক .then()এবং ব্যবহারের মধ্যে পার্থক্য দেখতে পাচ্ছি না .done()। আমি জানি যে এরিক হ্যান্ডস সেই উল্লেখ করেছে .done()এবং .success()একই কার্যকারিতাটিতে মানচিত্র তৈরি করেছে তবে আমি .then()কল্পনা করছি যে সমস্ত কলব্যাকগুলি একটি সফল অপারেশনের সমাপ্তির জন্য অনুরোধ করা হয়েছিল।

কেউ দয়া করে সঠিক ব্যবহারের জন্য আমাকে আলোকিত করতে পারেন?


15
দয়া করে প্রত্যেকে জেনে নিন যে জুন 2016 এ মুক্তিপ্রাপ্ত জিকুয়ারি 3.0 হ'ল প্রথম সংস্করণ যা প্রতিশ্রুতি / এ + এবং ইএস2015 প্রতিশ্রুতিগুলির সাথে অনুগত ছিল। এর আগে বাস্তবায়নে কোন প্রতিশ্রুতি দেওয়ার কথা ছিল তার অসঙ্গতি ছিল।
ফ্লিম

কখন কী ব্যবহার করতে হবে তার জন্য উন্নত প্রস্তাব দিয়ে আমার উত্তর আপডেট করেছি
রবার্ট সিমার

উত্তর:


577

done()বিলম্বিত সমস্যার সমাধান হলে সংযুক্ত কলব্যাকগুলি বরখাস্ত করা হবে। fail()পিছিয়ে দেওয়া প্রত্যাখাত হলে সংযুক্ত কলব্যাকগুলি বরখাস্ত করা হবে।

JQuery 1.8 এর আগে, then()কেবল সিনট্যাকটিক চিনি ছিল:

promise.then( doneCallback, failCallback )
// was equivalent to
promise.done( doneCallback ).fail( failCallback )

1.8 হিসাবে, then()এর একটি নাম pipe()এবং এটি একটি নতুন প্রতিশ্রুতি দেয়, আরও তথ্যের জন্য এখানে দেখুন pipe()

success()এবং error()কেবলমাত্র jqXHRকোনও কল দিয়ে ফেরত দেওয়া সামগ্রীতে উপলভ্য ajax()। এগুলি যথাক্রমে done()এবং fail()যথাক্রমে সহজ উপাধি :

jqXHR.done === jqXHR.success
jqXHR.fail === jqXHR.error

এছাড়াও, done()একক কলব্যাকের মধ্যে সীমাবদ্ধ নয় এবং অ-ফাংশনগুলি ফিল্টার করবে (যদিও সংস্করণ 1.8-এ স্ট্রিং সহ একটি বাগ রয়েছে যা 1.8.1 এ ঠিক করা উচিত):

// this will add fn1 to 7 to the deferred's internal callback list
// (true, 56 and "omg" will be ignored)
promise.done( fn1, fn2, true, [ fn3, [ fn4, 56, fn5 ], "omg", fn6 ], fn7 );

একই জন্য যায় fail()


8
thenএকটি নতুন প্রতিশ্রুতি ফিরিয়ে দেওয়া একটি মূল বিষয় ছিল যা আমি মিস করছি। আমি বুঝতে পারি না কেন একটি শৃঙ্খলা জাতীয় শৃঙ্খলা অপরিশোধিত কেন $.get(....).done(function(data1) { return $.get(...) }).done(function(data2) { ... })ব্যর্থ হচ্ছে data2; যখন আমি পরিবর্তিত doneকরতে thenএটা কাজ, কারণ আমি সত্যিই নল প্রতিশ্রুতি অনুপস্থিত ছিল একসঙ্গে বদলে মূল প্রতিশ্রুতি রক্ষায় কে অধিক হ্যান্ডেলার সংযুক্ত করুন।
wrschneider

5
jQuery 3.0 হ'ল প্রথম সংস্করণ যা প্রতিশ্রুতি / এ + এবং ইএস ২০১৫ স্পেকের সাথে সম্মতিযুক্ত।
ফ্লিম

4
আমি এখনও বুঝতে পারি না কেন আমি অন্যটির উপরে কেন ব্যবহার করব। আমি যদি একটি অজ্যাক্স কল করি এবং আমি অন্য এজ্যাক্স কল করার আগে call কলটি সম্পূর্ণরূপে শেষ না হওয়া পর্যন্ত তার অর্থ অপেক্ষা করতে হবে (যার অর্থ সার্ভার থেকে প্রত্যাবর্তন ফিরে এসেছে), আমি কি ব্যবহার করব doneনাকি then? কেন?
কোডিংইয়োশি

@ কোডিংইয়োশি শেষ পর্যন্ত সেই প্রশ্নের উত্তর দেওয়ার জন্য আমার উত্তর দেখুন (ব্যবহার করুন .then())।
রবার্ট সিমার

413

রিটার্নের ফলাফলগুলি প্রক্রিয়া করার পদ্ধতিতেও পার্থক্য রয়েছে (কলিং doneচেইন thenতৈরি করার সময় এটি চেইন বলে, চেইন করে না )

promise.then(function (x) { // Suppose promise returns "abc"
    console.log(x);
    return 123;
}).then(function (x){
    console.log(x);
}).then(function (x){
    console.log(x)
})

নিম্নলিখিত ফলাফল লগ হবে:

abc
123
undefined

যদিও

promise.done(function (x) { // Suppose promise returns "abc"
    console.log(x);
    return 123;
}).done(function (x){
    console.log(x);
}).done(function (x){
    console.log(x)
})

নিম্নলিখিত পাবেন:

abc
abc
abc

---------- হালনাগাদ:

BTW। আমি উল্লেখ করতে ভুলে গেছি, আপনি যদি পারমাণবিক ধরণের মানের পরিবর্তে কোনও প্রতিশ্রুতি ফিরিয়ে দেন তবে অভ্যন্তরীণ প্রতিশ্রুতি সমাধান না হওয়া পর্যন্ত বাইরের প্রতিশ্রুতি অপেক্ষা করবে:

promise.then(function (x) { // Suppose promise returns "abc"
    console.log(x);
    return $http.get('/some/data').then(function (result) {
        console.log(result); // suppose result === "xyz"
        return result;
    });
}).then(function (result){
    console.log(result); // result === xyz
}).then(function (und){
    console.log(und) // und === undefined, because of absence of return statement in above then
})

সমান্তরাল বা অনুক্রমিক অ্যাসিনক্রোনাস অপারেশনগুলি রচনা করা যেমন এইভাবে খুব সোজা হয়ে যায়:

// Parallel http requests
promise.then(function (x) { // Suppose promise returns "abc"
    console.log(x);

    var promise1 = $http.get('/some/data?value=xyz').then(function (result) {
        console.log(result); // suppose result === "xyz"
        return result;
    });

    var promise2 = $http.get('/some/data?value=uvm').then(function (result) {
        console.log(result); // suppose result === "uvm"
        return result;
    });

    return promise1.then(function (result1) {
        return promise2.then(function (result2) {
           return { result1: result1, result2: result2; }
        });
    });
}).then(function (result){
    console.log(result); // result === { result1: 'xyz', result2: 'uvm' }
}).then(function (und){
    console.log(und) // und === undefined, because of absence of return statement in above then
})

উপরের কোডটি সমান্তরালভাবে দুটি HTTP অনুরোধগুলি ইস্যু করে যাতে অনুরোধগুলি আরও শীঘ্রই সম্পন্ন হয়, যখন এই নীচের HTTP অনুরোধগুলি ক্রমান্বয়ে চালিত হয় সুতরাং সার্ভারের লোড হ্রাস করে

// Sequential http requests
promise.then(function (x) { // Suppose promise returns "abc"
    console.log(x);

    return $http.get('/some/data?value=xyz').then(function (result1) {
        console.log(result1); // suppose result1 === "xyz"
        return $http.get('/some/data?value=uvm').then(function (result2) {
            console.log(result2); // suppose result2 === "uvm"
            return { result1: result1, result2: result2; };
        });
    });
}).then(function (result){
    console.log(result); // result === { result1: 'xyz', result2: 'uvm' }
}).then(function (und){
    console.log(und) // und === undefined, because of absence of return statement in above then
})

121
doneফলাফলটি thenপরিবর্তিত হয় যেখানে ফলাফলের কিছুই করে না এমন ধারণার জন্য +1 । ইমো অন্যদের দ্বারা বিশাল পয়েন্ট মিস করেছে।
শানিমাল

9
এটি সম্ভবত jQuery এর কোন সংস্করণে প্রযোজ্য তা উল্লেখ করার মতো, যেহেতু then1.8 তে আচরণটি পরিবর্তিত হয়েছে
bradley.ayers

4
+1 সোজা বিন্দু। কেউ যদি মিশ্রিত চেইনগুলি দেখতে চায় এবং ফলাফলগুলি কল করে তা দেখতে চাইলে আমি একটি চলমান উদাহরণ তৈরি করেছিdonethen
মাইকেল ক্রোপাট

7
উপরের উদাহরণটি হাইলাইট করে যে 'সম্পন্ন' প্রাথমিক প্রতিশ্রুতি বস্তুটিতে তৈরি করা হয়েছে তবে 'তারপরে' একটি নতুন প্রতিশ্রুতি দেয়।
পুলক কান্তি ভট্টাচার্য্য

2
এটি jQuery 1.8+ এর জন্য প্রযোজ্য। পুরানো সংস্করণ doneযেমন উদাহরণের মতো কাজ করে । পরিবর্তন thenকরার জন্য pipe1.8+ পেতে প্রাক 1.8 thenআচরণ।
ডেভিড হার্কনেস

57

.done() শুধুমাত্র একটি কলব্যাক রয়েছে এবং এটি সাফল্য কলব্যাক

.then() উভয় সাফল্য এবং ব্যর্থ কলব্যাকস রয়েছে

.fail() শুধুমাত্র একটি ব্যর্থ কলব্যাক আছে

সুতরাং আপনার কী করা উচিত তা আপনার উপর নির্ভর করে ... এটি সফল হয় বা ব্যর্থ হলে আপনি কি যত্নশীল হন?


18
আপনি উল্লেখ করতে ব্যর্থ যে 'তারপরে' কল চেইন উত্পাদন করে। Lu4 এর উত্তর দেখুন।
অলিগোফ্রেন

আপনার উত্তর 2011 থেকে হচ্ছে ... আজকাল তাদের প্রত্যাবর্তন মান তোলে then()থেকে ভিন্ন done()। যেহেতু then()প্রায়শই কেবল সাফল্য কলব্যাকের সাথে বলা হয় আপনার পয়েন্টটি মনে রাখার / জানার মূল বিষয়টির চেয়ে বরং বিশদ। (JQuery 3.0 এর আগে এটি কেমন ছিল তা বলতে পারি না))
রবার্ট সিমার

14

deferred.done ()

মুলতুবি সমাধান করা হলে হ্যান্ডলারদের ডাকা হবে । কল করার জন্য আপনি একাধিক কলব্যাক যুক্ত করতে পারেন।

var url = 'http://jsonplaceholder.typicode.com/posts/1';
$.ajax(url).done(doneCallback);

function doneCallback(result) {
    console.log('Result 1 ' + result);
}

আপনি উপরেও এভাবে লিখতে পারেন,

function ajaxCall() {
    var url = 'http://jsonplaceholder.typicode.com/posts/1';
    return $.ajax(url);
}

$.when(ajaxCall()).then(doneCallback, failCallback);

deferred.then ()

যখন ডিফার্ড সমাধান করা হয়, প্রত্যাখ্যাত হয় বা এখনও প্রগতিতে থাকে তখন ডেকে আনা হ্যান্ডলারগুলি যুক্ত করে ।

var url = 'http://jsonplaceholder.typicode.com/posts/1';
$.ajax(url).then(doneCallback, failCallback);

function doneCallback(result) {
    console.log('Result ' + result);
}

function failCallback(result) {
    console.log('Result ' + result);
}

thenকোনও failকলব্যাক সরবরাহ না করা হলে কী আচরণ করে তা আপনার পোস্টটি পরিষ্কার করে দেয় না - যেমন failমামলাটি একেবারেই ক্যাপচার না করে
BM

ব্যর্থ কেস একটি ব্যতিক্রম উত্থাপন করে যা প্রোগ্রামের শীর্ষ স্তরের দ্বারা ধরা যেতে পারে। আপনি জাভাস্ক্রিপ্ট কনসোলটিতেও ব্যতিক্রম দেখতে পাবেন।
ডেভিড স্পেকটার

10

প্রকৃতপক্ষে একটি বেশ সমালোচনামূলক পার্থক্য রয়েছে, ইনফোফার হিসাবে jQuery এর ডিফার্ডগুলি প্রতিশ্রুতিগুলির বাস্তবায়ন হতে বোঝায় (এবং jQuery3.0 আসলে এগুলি অনুমানের মধ্যে আনার চেষ্টা করে)।

সম্পন্ন / তার মধ্যে মূল পার্থক্য হ'ল

  • .done() আপনি যা করেন বা আপনি কী ফিরিয়ে দেন তা বিবেচনা না করে সর্বদা একই প্রতিশ্রুতি / মোড়ানো মানগুলি ফেরত দেয়।
  • .then() সর্বদা একটি নতুন প্রতিশ্রুতি ফেরত দেয় এবং আপনি যে ফাংশনটি এটি পাস করেছিলেন তার ভিত্তিতে সেই প্রতিশ্রুতি কী তা নিয়ন্ত্রণ করার দায়িত্বে আছেন।

নেটিভ ES2015 প্রতিশ্রুতিগুলিতে jQuery থেকে অনুবাদ, .done()এটি প্রতিশ্রুতি চেইনের কোনও ফাংশনকে ঘিরে "ট্যাপ" কাঠামো বাস্তবায়নের মতো, এটি যদি শৃঙ্খলা "সমাধান" অবস্থায় থাকে তবে কোনও ক্রিয়াকলাপের মান প্রদান করবে .. ... তবে সেই ফাংশনের ফলাফল চেইনে নিজেই প্রভাব ফেলবে না।

const doneWrap = fn => x => { fn(x); return x };

Promise.resolve(5)
       .then(doneWrap( x => x + 1))
       .then(doneWrap(console.log.bind(console)));

$.Deferred().resolve(5)
            .done(x => x + 1)
            .done(console.log.bind(console));

যারা উভয় লগ 5 হবে, 6 না।

নোট করুন যে আমি লগিং করতে করানো এবং সম্পন্ন র‌্যাপ ব্যবহার করেছি, তা নয়। এটি কারণ কনসোল.লগ ফাংশনগুলি আসলে কিছুই ফেরায় না। এবং আপনি যদি পাস করেন তবে কি হয়? এমন কোনও ফাংশন যা কিছু ফেরত না?

Promise.resolve(5)
       .then(doneWrap( x => x + 1))
       .then(console.log.bind(console))
       .then(console.log.bind(console));

এটি লগ হবে:

5

অনির্দিষ্ট

কি হলো? যখন আমি এটি ব্যবহার করি এবং এটি কোনও ফাংশন পাস করে যা কোনও কিছুই ফেরত না, তার অন্তর্নিহিত ফলাফলটি ছিল "অপরিজ্ঞাত" ... যা অবশ্যই পরবর্তীতে পদ্ধতিতে একটি প্রতিশ্রুতি [অপরিজ্ঞাত] ফিরিয়েছিল, যা অপরিজ্ঞাত ছিল logged সুতরাং আমরা যে মূল মানটি দিয়ে শুরু করেছি তা মূলত হেরে গেছে।

.then()এটি, হৃদয়ে, ফাংশন রচনাগুলির একটি রূপ: প্রতিটি পদক্ষেপের ফলাফলটি পরবর্তী পদক্ষেপে ফাংশনের আর্গুমেন্ট হিসাবে ব্যবহৃত হয়। এই কারণেই .ডোনটিকে "ট্যাপ" হিসাবে সবচেয়ে ভালভাবে ভাবা হয় -> এটি আসলে রচনার অংশ নয়, এটি এমন কিছু যা একটি নির্দিষ্ট ধাপে মানটির দিকে নজর রাখে এবং সেই মানটিতে একটি ক্রিয়াকলাপ চালায় তবে বাস্তবে পরিবর্তন হয় না কোনওভাবেই রচনা।

এটি একটি চমত্কার মৌলিক পার্থক্য, এবং দেশীয় প্রতিশ্রুতিগুলির একটি .ডোন পদ্ধতি তাদের প্রয়োগ না করার সম্ভবত একটি ভাল কারণ রয়েছে। কেন আমাদের .fail পদ্ধতি নেই সেদিকে toুকতে হবে না, কারণ এটি আরও জটিল (যেমন, .fail / .catch .done / .then -> ফাংশনগুলির আয়না নয়। "থাকুন" যেমন পাস করা হয়েছে তাদের মতো প্রত্যাখ্যাত হয়েছে then


6

then()সর্বদা মানে এটি যে কোনও ক্ষেত্রেই ডাকা হবে। প্যারামিটারগুলি পাশ করা বিভিন্ন jQuery সংস্করণে পৃথক।

JQuery 1.8 এর আগে, then()সমান done().fail()। এবং সমস্ত কলব্যাক ফাংশন একই পরামিতি ভাগ করে।

তবে jQuery 1.8 হিসাবে, then()একটি নতুন প্রতিশ্রুতি ফেরত দেয় এবং যদি এটির কোনও মান ফিরে আসে তবে এটি পরবর্তী কলব্যাক ফাংশনে চলে যাবে।

আসুন নীচের উদাহরণটি দেখুন:

var defer = jQuery.Deferred();

defer.done(function(a, b){
            return a + b;
}).done(function( result ) {
            console.log("result = " + result);
}).then(function( a, b ) {
            return a + b;
}).done(function( result ) {
            console.log("result = " + result);
}).then(function( a, b ) {
            return a + b;
}).done(function( result ) {
            console.log("result = " + result);
});

defer.resolve( 3, 4 );

JQuery 1.8 এর আগে উত্তরটি হওয়া উচিত

result = 3
result = 3
result = 3

সমস্ত resultলাগে 3. এবং then()ফাংশন সর্বদা একই স্থগিত বস্তু পরবর্তী ফাংশনে পাস করে।

তবে jQuery 1.8 হিসাবে, ফলাফলটি হওয়া উচিত:

result = 3
result = 7
result = NaN

কারণ প্রথম then()ফাংশনটি একটি নতুন প্রতিশ্রুতি দেয়, এবং মান 7 (এবং এটিই কেবলমাত্র পরামিতিটি পাস হবে) পরবর্তীটিতে পাস করা হয় done(), সুতরাং দ্বিতীয়টি done()লিখুন result = 7। দ্বিতীয়টি then()7 এর মান হিসাবে aনেয় undefinedএবং এর মান হিসাবে গ্রহণ করে b, তাই দ্বিতীয়টি then()প্যারামিটার NaN সহ একটি নতুন প্রতিশ্রুতি দেয় এবং done()এর ফলাফল হিসাবে শেষ ন্যানগুলি প্রিন্ট করে।


"তারপরে () সর্বদা অর্থ এটি যে কোনও ক্ষেত্রেই বলা হবে" - সত্য নয়। তাহলে () প্রতিশ্রুতি ভিতরে ত্রুটির ক্ষেত্রে কখনও বলা হয় না।
ডেভিড স্পেকটার

আকর্ষণীয় দিকটি যে কোনও jQuery.Deferred()একাধিক মান অর্জন করতে পারে, যা এটি যথাযথভাবে প্রথমটিতে চলে যায় .then()— কিছুটা আশ্চর্য হলেও ... যেহেতু নিম্নলিখিত কোনওটি এটি .then()করতে পারে না। (এর মাধ্যমে নির্বাচিত ইন্টারফেস কেবল returnএকটি মান ফিরিয়ে দিতে পারে)) জাভাস্ক্রিপ্টের নেটিভ এটি Promiseকরে না। (যা আরও সুসংগত, সত্যি বলতে।)
রবার্ট সিমার

3

প্রতিক্রিয়াটিতে একটি খুব সাধারণ মানসিক মানচিত্র রয়েছে যা অন্যান্য উত্তরগুলিতে পাওয়া কিছুটা কঠিন ছিল:


2

শুধুমাত্র ব্যবহার .then()

এগুলির অসুবিধাগুলি .done()

  • শৃঙ্খলাবদ্ধ হতে পারে না
  • ব্লক resolve()কল (সমস্ত .done()হ্যান্ডলারগুলি সিঙ্ক্রোনাস কার্যকর করা হবে)
  • resolve()নিবন্ধিত .done()হ্যান্ডলারের (!) থেকে ব্যতিক্রম পেতে পারে
  • .done()অর্ধ-মেরে একটি ব্যতিক্রম স্থগিত:
    • আরও .done()হ্যান্ডলারের নিঃশব্দে এড়ানো হবে

আমি অস্থায়ীভাবে ভেবেছিলাম যে .then(oneArgOnly)সর্বদা প্রয়োজন .catch()যাতে যাতে কোনও ব্যতিক্রম চুপচাপ উপেক্ষা করা না যায় তবে এটি আর সত্য নয়: unhandledrejectionইভেন্টটি .then()কনসোলে অবিচ্ছিন্ন ব্যতিক্রমগুলি লগ করে (ডিফল্ট হিসাবে)। খুব যুক্তিসঙ্গত! মোটেও ব্যবহার করার কোনও কারণ নেই .done()

প্রমাণ

নিম্নলিখিত কোড স্নিপেট প্রকাশ করে, যে:

  • সমস্ত .done()হ্যান্ডলারগুলি বিন্দুতে সিঙ্ক্রোনাস বলা হবেresolve()
    • 1, 3, 5, 7 হিসাবে লগ ইন
    • স্ক্রিপ্ট নীচে মাধ্যমে পড়ে আগে লগ ইন
  • একটি .done()প্রভাব resolve()কলারে ব্যতিক্রম
    • কাছাকাছি মাধ্যমে লগ ইন resolve()
  • ব্যতিক্রম আরও .done()রেজোলিউশন থেকে প্রতিশ্রুতি বিরতি
    • 8 এবং 10 লগ করা হয় না!
  • .then() এগুলির কোনও সমস্যা নেই
    • থ্রেডটি নিষ্ক্রিয় হয়ে যাওয়ার পরে 2, 4, 6, 9, 11 হিসাবে লগ হয়েছে
    • (স্নিপেট পরিবেশের unhandledrejectionমনে হয় না)

বিটিডব্লিউ, ব্যতিক্রমগুলি .done()সঠিকভাবে ধরা যায় না: এর সিঙ্ক্রোনাস প্যাটার্নের .done()কারণে ত্রুটিটি হয় হয় .resolve()(লাইব্রেরি কোড হতে পারে!) এর বিন্দুতে ফেলে দেওয়া হয় বা যে .done()কলটিতে অপরাধীকে সংযুক্ত করা হয় যদি পিছিয়ে দেওয়া ইতিমধ্যে সমাধান হয়ে যায়।

console.log('Start of script.');
let deferred = $.Deferred();
// deferred.resolve('Redemption.');
deferred.fail(() => console.log('fail()'));
deferred.catch(()=> console.log('catch()'));
deferred.done(() => console.log('1-done()'));
deferred.then(() => console.log('2-then()'));
deferred.done(() => console.log('3-done()'));
deferred.then(() =>{console.log('4-then()-throw');
    throw 'thrown from 4-then()';});
deferred.done(() => console.log('5-done()'));
deferred.then(() => console.log('6-then()'));
deferred.done(() =>{console.log('7-done()-throw');
    throw 'thrown from 7-done()';});
deferred.done(() => console.log('8-done()'));
deferred.then(() => console.log('9-then()'));

console.log('Resolving.');
try {
    deferred.resolve('Solution.');
} catch(e) {
    console.log(`Caught exception from handler
        in resolve():`, e);
}
deferred.done(() => console.log('10-done()'));
deferred.then(() => console.log('11-then()'));
console.log('End of script.');
<script
src="https://code.jquery.com/jquery-3.4.1.min.js"
integrity="sha384-vk5WoKIaW/vJyUAd9n/wmopsmNhiy+L2Z+SBxGYnUkunIxVxAv/UtMOhba/xskxh"
crossorigin="anonymous"
></script>


কয়েকটি জিনিস: ১) আপনি যা বলছেন তা আমি দেখতে পেয়েছি যা doneযদি পূর্বের কাজটি ব্যতিক্রম হয় তবে তা কার্যকর করা হবে না। তবে কেন এটি চুপচাপ উপেক্ষা করা হবে, আমার অর্থ একটি ব্যতিক্রম ঘটেছে তাই আপনি কেন এটি নীরব বলছেন। 2) আমি Deferredবস্তুকে তুচ্ছ করি কারণ এর এপিআই খুব খারাপভাবে সম্পন্ন হয়েছে। এটি অত্যন্ত জটিল এবং বিভ্রান্তিকর। আপনার কোডটি এখানে আপনার পয়েন্টটি প্রমাণ করতে সহায়তা করে না এবং আপনি যা প্রমাণ করার চেষ্টা করছেন তার জন্য এটি অত্যধিক অপ্রয়োজনীয় জটিলতা রয়েছে। 3) কেন doneসূচক 2, 4, এবং 6 2nd সামনে সঞ্চালিত then?
কোডিংইয়োশি

আমার খারাপ, আপনি অবশ্যই ভোটের দাবিদার ser ব্যতিক্রম সম্পর্কে আপনার মন্তব্য হিসাবে, সাধারণত ব্যতিক্রমগুলি কীভাবে কাজ করে: একবার উত্থাপিত হওয়ার পরে কোড কার্যকর করা হবে না। প্লাস jQuery ডকুমেন্টেশন জানিয়েছে যে মুলতুবি স্থগিত হলেই এটি কার্যকর করা হবে।
কোডিংইয়োশি

@ কোডিংইয়োশি পরিস্থিতি এখানে অন্যরকম: আমি কেবল সমাধানিত প্রতিশ্রুতি / বিলম্বিত বিষয়ে কথা বলছিলাম। আমি অভিযোগ করছি না যে বাকী সাফল্য-হ্যান্ডলারকে ডাকা হয়নি, এটি স্বাভাবিক। তবে আমি কোনও কারণ দেখছি না কেন একটি সফল প্রতিশ্রুতিতে সম্পূর্ণ ভিন্ন সাফল্য-হ্যান্ডলারকে ডাকা হয় নি। সমস্ত .then()বলা হবে, ব্যতিক্রম (যারা হ্যান্ডলারের মধ্যে) উত্থাপিত হয়েছে বা না। তবে সংযোজন / বাকি .done()বিরতি।
রবার্ট সিমার

@ কোডিংয়েশি আমাকে যদি উত্তর দেওয়ার অনুমতি দেয় তবে আমি আমার উত্তরটির ব্যাপক উন্নতি করেছি। কোড এবং পাঠ্য।
রবার্ট সিমার

1

JQuery 3.0 এর মতো আরও একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে যা সহজেই অপ্রত্যাশিত আচরণের দিকে পরিচালিত করতে পারে এবং পূর্ববর্তী উত্তরে উল্লেখ করা হয়নি:

নিম্নলিখিত কোড বিবেচনা করুন:

let d = $.Deferred();
d.done(() => console.log('then'));
d.resolve();
console.log('now');
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>

এই আউটপুট হবে:

then
now

এখন, খুব একই স্নিপেট done()দ্বারা প্রতিস্থাপন then():

var d = $.Deferred();
d.then(() => console.log('then'));
d.resolve();
console.log('now');
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>

আউটপুট এখন:

now
then

সুতরাং, তাত্ক্ষণিকভাবে নিষ্পত্তি স্থগিতকরণের জন্য, কার্যটি done()সর্বদা একটি সিনক্রোনাস পদ্ধতিতে ডাকা হবে, যেখানে যে কোনও যুক্তি then()অ্যাসিঙ্ক করা হয়েছে।

এটি পূর্ববর্তী jQuery সংস্করণগুলির থেকে পৃথক যেখানে উভয় কলব্যাকগুলি সিঙ্ক্রোনসিভভাবে কল করা হয়, যেমন আপগ্রেড গাইডে উল্লেখ করা হয়েছে :

প্রতিশ্রুতি / এ + সম্মতির জন্য আবশ্যক আরেকটি আচরণ পরিবর্তন হ'ল মুলতুবি .যে () কলব্যাকগুলি সর্বদা অবিচ্ছিন্নভাবে বলা হয়। পূর্বে, যদি ইতিমধ্যে সমাধান করা বা প্রত্যাখ্যাত একটি ডিফার্ডে একটি (ত) কলব্যাক যুক্ত করা হয়, তবে কলব্যাকটি তাত্ক্ষণিকভাবে এবং সিঙ্ক্রোনিকভাবে চলবে।


-5

.done()প্রতিশ্রুতি শৃঙ্খলা সমাপ্ত করে, নিশ্চিত হয়ে অন্য কিছু পদক্ষেপ সংযুক্ত করতে পারে না। এর অর্থ হ'ল jQuery প্রতিশ্রুতি বাস্তবায়ন যে কোনও অনিয়ন্ত্রিত ব্যতিক্রম ছুঁড়ে ফেলতে পারে, যেহেতু কেউ এটি ব্যবহার করে এটি পরিচালনা করতে পারে না .fail()

ব্যবহারিক ক্ষেত্রে, যদি আপনি কোন প্রতিশ্রুতিতে আরও পদক্ষেপ সংযুক্ত করার পরিকল্পনা না করেন তবে আপনার ব্যবহার করা উচিত .done()। আরও তথ্যের জন্য দেখুন প্রতিশ্রুতিগুলি কেন করা দরকার


6
সতর্ক করা! এই উত্তরটি বেশিরভাগ প্রতিশ্রুতি বাস্তবায়নের জন্য সঠিক হবে তবে jQuery নয়, এতে সমাপনী .done()ভূমিকা নেই। ডকুমেন্টেশনটিতে বলা হয়েছে, "যেহেতু ডিফার্ড.ডোন () স্থগিত হওয়া বস্তুটি ফেরত দেয়, তাই পিছিয়ে দেওয়া অবজেক্টের অন্যান্য পদ্ধতিগুলি অতিরিক্ত .ডোন () পদ্ধতিগুলি সহ এটিকে শৃঙ্খলাবদ্ধ হতে পারে"। .fail()উল্লেখ করা হয়নি তবে, হ্যাঁ, এটিও বেঁধে দেওয়া যেতে পারে।
রোমের -1888

1
আমার খারাপ, jQuery চেক করেনি
gleb বাহমুটোভ

1
@্লেগবাহাহমুতভ - সম্ভবত আপনার এই উত্তরটি মুছে ফেলা উচিত যাতে অন্যরা বিভ্রান্ত না হয়? কেবল একটি বন্ধুত্বপূর্ণ পরামর্শ :)
অ্যান্ড্রে

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