কৌণিক এইচটিপিপিউমাইজ: `সাফল্য /` ত্রুটি `পদ্ধতি এবং` তখন` যুক্তিগুলির মধ্যে পার্থক্য


177

অ্যাঙ্গুলারজেএস ডকের মতে $httpনিম্নলিখিতগুলি ফেরত দেওয়ার জন্য কলগুলি :

মানক তারপর পদ্ধতি এবং দুটি HTTP নির্দিষ্ট পদ্ধতি: সাফল্য এবং ত্রুটি সহ একটি প্রতিশ্রুতি অবজেক্ট প্রদান করে । তারপর পদ্ধতি দুটি আর্গুমেন্ট একটি লাগে সাফল্য এবং একটি ত্রুটি কলব্যাক যা একটি প্রতিক্রিয়া বস্তুর সঙ্গে ডাকা হবে। সাফল্য এবং ত্রুটি একটি ফাংশন যে যখন অনুরোধ সফল বা বিফল হও যথাক্রমে ব্যর্থ বলা হবে - পদ্ধতি একটি একক যুক্তি গ্রহণ করা। এই ফাংশনগুলিতে প্রেরিত আর্গুমেন্টগুলি তত্কালীন পদ্ধতিতে পাস হওয়া প্রতিক্রিয়া অবজেক্টটির কাঠামোগত উপস্থাপনা।

responseএকদিকে অবজেক্টটি ডেস্ট্রাক্ট হওয়া বিষয়টিকে বাদ দিয়ে আমি এর মধ্যে পার্থক্য পাই না

  • সাফল্য / ত্রুটি কলব্যাকগুলি আর্গুমেন্ট হিসাবে পাস হতে পারে promise.then
  • কলব্যাকগুলি প্রতিজ্ঞার promise.success/ promise.errorপদ্ধতির পক্ষে আর্গুমেন্ট হিসাবে পাস হয়েছিল

কোন আছে? আপাতদৃষ্টিতে অভিন্ন কলব্যাকগুলি পাস করার জন্য এই দুটি ভিন্ন উপায়ে কী আছে?

উত্তর:


156

এনবি এই উত্তরটি সত্যই ভুল; নীচে একটি মন্তব্য দ্বারা নির্দেশিত হিসাবে, সাফল্য () মূল প্রতিশ্রুতি ফিরে দেয়। আমি পরিবর্তন করব না; এবং এটি সম্পাদনা করতে ওপিতে ছেড়ে দিন।


2 এর মধ্যে প্রধান পার্থক্য হ'ল .then()কলটি যখন প্রতিশ্রুতি দেয় (কলব্যাক থেকে ফেরত মান দিয়ে সমাধান করা হয়).success() কলব্যাকগুলি নিবন্ধকরণের আরও traditionalতিহ্যগত উপায় এবং কোনও প্রতিশ্রুতি ফেরত না।

প্রতিশ্রুতি ভিত্তিক কলব্যাকস ( .then()) প্রতিশ্রুতিগুলি সাজাতে সহজ করে তোলে (একটি কল করুন, ফলাফলগুলি ব্যাখ্যা করুন এবং তারপরে আরও একটি কল করুন, ফলাফল ব্যাখ্যা করুন, আরও একটি কল করুন ইত্যাদি)।

.success()পদ্ধতি একটি স্ট্রিমলাইনড, সুবিধার পদ্ধতি যখন আপনি (রাউটিং মধ্যে, উদাহরণস্বরূপ) শৃঙ্খল কল কিংবা প্রতিশ্রুতি API- এর সাথে কাজ করতে হবে না।

সংক্ষেপে:

  • .then() - প্রতিশ্রুতি এপিআই এর সম্পূর্ণ ক্ষমতা কিন্তু কিছুটা আরও ভার্বোস
  • .success() - কোন প্রতিশ্রুতি ফিরিয়ে দেয় না তবে কিছুটা বেশি স্বাচ্ছন্দ্যের বাক্য সরবরাহ করে

44
আরেকটি বড় পার্থক্য যে thenপ্রতিক্রিয়া - - যখন callbacks একটি একক যুক্তি নেওয়া successএবং errorযেমন arguments-- সাড়া পৃথক উপাদান data, status, header, এবং config
মিশেল টিলে

1
@ ব্র্যান্ডনটিলি পুরোপুরি সঠিক, তবে প্রশ্নের লেখক এটি ইতিমধ্যে খুঁজে পেয়েছেন তাই আমার মনে হয় নি যে এখানে এটি পুনরাবৃত্তি করা দরকার।
pkozlowski.opensource

45
যদিও ডকুমেন্টেশনটি এত স্পষ্টভাবে না বলে, আমরা অনুমান করতে পারি যে .success()পদ্ধতিটি মূল $ http প্রতিশ্রুতি বস্তুটি প্রত্যাবর্তন করে, কারণ চেইন $http(...).success(...).error(...)সম্ভব। যদি, যুক্তিসঙ্গত বলে মনে হয় তবে বিপরীতটিও $http(...).error(...).success(...)সম্ভব, তবে .error()মূল প্রতিশ্রুতি বস্তুটিও ফেরত দেওয়া উচিত। পার্থক্যটি .then()হ'ল এটি একটি নতুন প্রতিশ্রুতি দেয় returns
বিটরুট-বিটরুট

2
$ Http পরিষেবাটির কৌণিক.জেএস থেকে উত্স কোড: promise.success = function(fn) { promise.then(function(response) { fn(response.data, response.status, response.headers, config); }); return promise; };
অ্যালেক্স চে

6
দয়া করে নোট করুন যে successহ্রাস করা হয়েছে। ডকস.আঙ্গুলারজ.স.আর্গ The $http legacy promise methods success and error have been deprecated. Use the standard then method instead. If $httpProvider.useLegacyPromiseExtensions is set to false then these methods will throw $http/legacy error.
স্যাম

204

এখানে ইতিমধ্যে কিছু ভাল উত্তর আছে। তবে প্রদত্ত সমান্তরালতার মধ্যে পার্থক্যটি বাড়িতে চালানো সার্থক:

  • success() আসল প্রতিশ্রুতি ফিরিয়ে দেয়
  • then() একটি নতুন প্রতিশ্রুতি ফেরত

পার্থক্যটি then()ক্রমানুসারে পরিচালিত ক্রিয়াকলাপ, যেহেতু প্রতিটি কল একটি নতুন প্রতিশ্রুতি দেয়।

$http.get(/*...*/).
  then(function seqFunc1(response){/*...*/}).
  then(function seqFunc2(response){/*...*/})
  1. $http.get()
  2. seqFunc1()
  3. seqFunc2()

success() সমান্তরাল অপারেশনগুলি চালায়, যেহেতু হ্যান্ডলাররা একই প্রতিশ্রুতিতে জড়িত থাকে।

$http(/*...*/).
  success(function parFunc1(data){/*...*/}).
  success(function parFunc2(data){/*...*/})
  1. $http.get()
  2. parFunc1(), parFunc2()সমান্তরাল

3
নতুন প্রতিশ্রুতি প্রতিক্রিয়াটি একবার এবং পদ্ধতিগুলিতে অদৃশ্য হয়ে thenযাওয়ার ফলাফলটি পৌঁছে দেওয়ার পরে নোট করুন । এছাড়াও, HTTP ত্রুটির প্রতিক্রিয়াগুলির জন্য (উদাহরণস্বরূপ 404) হ্যান্ডলারের মধ্যে প্রথমটি প্রবেশ করবে তবে নিম্নলিখিতগুলি হ্যান্ডলারে প্রবেশ করবে । মূলত শৃঙ্খলযোগ্য তবে $ q প্রতিশ্রুতিগুলি একেবারে আলাদা যে তারা সমস্ত বিশেষত পরিচালনা করার প্রতিশ্রুতি এবং ক্রম (এবং HTTP অনুরোধ পরিচালনা নয়) about আমি নিবিড় নজর না দেওয়া পর্যন্ত এটি বুঝতে আমার খুব কষ্ট হয়েছিল। successerrorthenhttp.then(ok, err).then(ok, err)errokhttp.success().error().success().error()
জিম্মন্ট

1
@ জিমমন্ট successএবং errorকোনও প্রতিশ্রুতির সাধারণ এপিআই নয়, এগুলি $ http () এর রিটার্ন ভ্যালুতে বোল্ট হয়।
ইভেন্ট_জেআর

ধন্যবাদ @event_jr এটি আমার কাছে পরিষ্কার, এবং ডক্সে ডেকে আনা হয়েছে। যা আমার কাছে পরিষ্কার ছিল না তা হল কীভাবে $ q এবং $ http বিভিন্ন সমস্যার সমাধান করার পাশাপাশি নতুন প্রতিশ্রুতি ফিরিয়ে আনতে বনাম একইটি পাস করে - আপনার (অতি সহায়ক) উত্তরে নির্দেশিত হিসাবে।
জিম্মন্ট

1
সমান্তরাল বলতে কী বোঝায়, যেহেতু জেএস একক থ্রেডেড? আপনি কি বোঝাতে চেয়েছেন যে ফাঁসির আদেশটি অ-নিষেধাত্মক?
ডেরেক

2
@ ডেরেক দ্বিতীয়টি successকার্যকর করেছেন প্রথমটি কার্যকর হওয়ার পরে তবে তা থেকে কোনও প্রতিশ্রুতি ফিরে পাওয়ার আগেই দ্বিতীয়টি thenঅপেক্ষা করবে। যদি আপনি প্রতিশ্রুতি ফেরত না থাকেন তবে উভয়ই একই আচরণ করে।
তমলিন

114

সাধারণ জিইটি অনুরোধের জন্য কয়েকটি কোড উদাহরণ। হতে পারে এটি পার্থক্য বুঝতে সাহায্য করে। ব্যবহার then:

$http.get('/someURL').then(function(response) {
    var data = response.data,
        status = response.status,
        header = response.header,
        config = response.config;
    // success handler
}, function(response) {
    var data = response.data,
        status = response.status,
        header = response.header,
        config = response.config;
    // error handler
});

ব্যবহার success/ error:

$http.get('/someURL').success(function(data, status, header, config) {
    // success handler
}).error(function(data, status, header, config) {
    // error handler
});

5
আপনাকে ধন্যবাদ, তবে প্রশ্নটি এই ফাংশনগুলি কী করে তার মধ্যে পার্থক্য বা তারা একই জিনিসটি করলে উভয়ের উপস্থিতি কেন তা আরও ছিল about এগুলি কীভাবে ব্যবহার করবেন সে বিষয়ে পার্থক্যটি ডক থেকে বোঝা যায়।
ejoubaud

39
আমি ব্যক্তিগতভাবে শর্ট কোড উদাহরণ পছন্দ করি এবং এটি আমি এখানে পোস্ট করেছি। কৌণিক ডক্স কখনও কখনও সংক্ষিপ্ত সুনির্দিষ্ট উদাহরণগুলি মিস করে miss
দি হিপ্পো

2
এটি প্রথম গুরুত্বপূর্ণ বিষয়টির প্রতিক্রিয়াশীল অবজেক্টটিতে দ্বিতীয় গিস্টের "ডেটা, স্থিতি, শিরোনাম এবং কনফিগারেশন" রয়েছে তা সত্যভাবে তুলে ধরা গুরুত্বপূর্ণ important তার মানে যে প্রতিক্রিয়াযুক্ত অবজেক্টগুলির গভীরতার এক স্তরের অ্যাডিশনাল রয়েছে।
জুম

data,status,header,configকেবল ফিরে আসার ক্ষেত্রে ভেরিয়েবলগুলিতে প্রতিক্রিয়া মানগুলি পাশ করার কোনও সুবিধা আছে কি response?
5

27

.পথ () চেইনযোগ্য এবং পূর্ববর্তীগুলির জন্য অপেক্ষা করবে then

.success () এবং .error () কে চেইন করা যেতে পারে তবে তারা সমস্ত একবারে আগুন ধরিয়ে দেবে (এতোটুকু বিন্দু নয়)

.success () এবং .error () সাধারণ কলগুলির জন্য সহজ (সহজ নির্মাতারা):

$http.post('/getUser').success(function(user){ 
   ... 
})

সুতরাং আপনি এটি টাইপ করতে হবে না:

$http.post('getUser').then(function(response){
  var user = response.data;
})

তবে সাধারণত .catch () দিয়ে আমি সমস্ত ত্রুটি পরিচালনা করি:

$http.get(...)
    .then(function(response){ 
      // successHandler
      // do some stuff
      return $http.get('/somethingelse') // get more data
    })
    .then(anotherSuccessHandler)
    .catch(errorHandler)

আপনার যদি <= IE8 সমর্থন করার প্রয়োজন হয় তবে আপনার। ক্যাচ () এবং .ফিনালি () এর মতো (আই-তে সংরক্ষিত পদ্ধতি) লিখুন:

    .then(successHandler)
    ['catch'](errorHandler)

কাজের উদাহরণ:

এখানে আরও কিছু কোডি ফর্ম্যাটে আমার স্মৃতিতে রিফ্রেশ করার জন্য যা কিছু লিখেছিল তা হ্যান্ডলিংয়ের ত্রুটিগুলি সহ কীভাবে কার্যকর হয় তা এখানে:

http://jsfiddle.net/nalberg/v95tekz2/


"রিটার্ন-অন্য-প্রতিশ্রুতি" কীভাবে কাজ করে তার একমাত্র উত্তর
zjk

17

কেবলমাত্র সমাপ্তির জন্য, এখানে একটি কোড উদাহরণ যা পার্থক্যগুলি নির্দেশ করে:

সাফল্য \ ত্রুটি:

$http.get('/someURL')
.success(function(data, status, header, config) {
    // success handler
})
.error(function(data, status, header, config) {
    // error handler
});

তারপর:

$http.get('/someURL')
.then(function(response) {
    // success handler
}, function(response) {
    // error handler
})
.then(function(response) {
    // success handler
}, function(response) {
    // error handler
})
.then(function(response) {
    // success handler
}, function(response) {
    // error handler
}).

দুর্দান্ত !, আপনার কি এমন উদাহরণ রয়েছে যেখানে সংক্ষিপ্তকরণ কার্যকর হতে পারে?
জুম

4
ধারণাটি হ'ল "তত্ক্ষণিক" পদ্ধতিটি আরও কার্যকর, যেহেতু আপনি একের পর এক অ্যাসিঙ্ক্রোনাস অপারেশনগুলি আরও সহজে লিখতে পারেন।
মাইকেললো

2

অফিসিয়াল নোটিশ: সাফল্য এবং ত্রুটি হ্রাস করা হয়েছে, দয়া করে পরিবর্তে স্ট্যান্ডার্ড পদ্ধতিটি ব্যবহার করুন।

অবমানন নোটিশ: $ এইচটিপি উত্তরাধিকার প্রতিশ্রুতি পদ্ধতি সাফল্য এবং ত্রুটি হ্রাস করা হয়েছে। পরিবর্তে স্ট্যান্ডার্ড পদ্ধতিটি ব্যবহার করুন। যদি $ HTTP- কে সরবরাহ করে use

লিঙ্ক: https://code.angularjs.org/1.5.7/docs/api/ng/service/$http

স্ক্রিনশট: স্ক্রিনশট দেখুন

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