.Json () কেন প্রতিশ্রুতি ফিরিয়ে দেয়?


115

আমি fetch()সম্প্রতি এপিআইয়ের সাথে ঘোরাঘুরি করেছি , এবং কিছুটা লক্ষ্য করেছিলাম যা কিছুটা উদ্বিগ্ন।

let url = "http://jsonplaceholder.typicode.com/posts/6";

let iterator = fetch(url);

iterator
  .then(response => {
      return {
          data: response.json(),
          status: response.status
      }
  })
  .then(post => document.write(post.data));
;

post.dataএকটি Promiseবস্তু ফেরত দেয় http://jsbin.com/wofulo/2/edit?js,output

তবে যদি এটি লিখিত হয়:

let url = "http://jsonplaceholder.typicode.com/posts/6";

let iterator = fetch(url);

iterator
  .then(response => response.json())
  .then(post => document.write(post.title));
;

postএখানে একটি মান Objectযা আপনি শিরোনাম বৈশিষ্ট্য অ্যাক্সেস করতে পারেন। http://jsbin.com/wofulo/edit?js,output

সুতরাং আমার প্রশ্নটি হল: কেন কোনও response.jsonবস্তু আক্ষরিক প্রতিশ্রুতি ফেরত দেয় তবে কেবল ফেরত দিলে মানটি ফেরত দেয়?


1
response.json()প্রতিক্রিয়াটি বৈধ JSON না হলে আপনি যখন প্রতিশ্রুতিটি প্রত্যাখাত হতে পারেন তা বিবেচনা করার সময় এটি অর্থবোধ করে।
ssube

1
মানটি ফেরত দেওয়া হয়েছে কারণ প্রতিশ্রুতিটি সমাধান করা হয়েছে response এখন মানটি সেই পদ্ধতিতে পাওয়া যায়।
জোসে হার্মোসিলা রদ্রিগো

উত্তর:


167

কেন response.jsonপ্রতিশ্রুতি ফিরিয়ে দেয়?

কারণ আপনি responseসমস্ত শিরোনাম আসার সাথে সাথেই তা পেয়েছেন। কলিং .json()আপনাকে এইচডিপি প্রতিক্রিয়ার শরীরের জন্য আরও একটি প্রতিশ্রুতি দেয় যা এখনও লোড হওয়া যায় না। আরও দেখুন জাভাস্ক্রিপ্ট ফেচ এপিআইয়ের প্রতিক্রিয়া অবজেক্ট কেন প্রতিশ্রুতি?

আমি thenহ্যান্ডলারের কাছ থেকে প্রতিশ্রুতি ফিরিয়ে দিলে কেন আমি মান পাব ?

কারণ যেভাবে কাজ প্রতিশ্রুতি । কলব্যাক থেকে প্রতিশ্রুতি ফিরিয়ে নেওয়ার ক্ষমতা এবং সেগুলি গ্রহণ করা তাদের সর্বাধিক প্রাসঙ্গিক বৈশিষ্ট্য, এটি বাসা ছাড়াই তাদের শৃঙ্খলাবদ্ধ করে তোলে।

তুমি ব্যবহার করতে পার

fetch(url).then(response => 
    response.json().then(data => ({
        data: data,
        status: response.status
    })
).then(res => {
    console.log(res.status, res.data.title)
}));

বা পূর্ববর্তী প্রতিশ্রুতি অ্যাক্সেসের জন্য পদ্ধতির কোনও অন্যটি জেসন বডিটির জন্য অপেক্ষা করার পরে প্রতিক্রিয়া স্থিতি পেতে একটি। টি () চেইনে ফলাফল দেয়


এটি অদ্ভুত বলে মনে হচ্ছে যে আমি কোনও প্রতিশ্রুতি ব্যবহার করে ডেটা ফেরার জন্য অপেক্ষা করতে পারি না, এবং এটি যখন আসবে তখন এটি জসনে রূপান্তরিত হবে? অথবা সম্ভবত সে ক্ষেত্রে আমি কেবল JSON.parse()পরিবর্তে ব্যবহার করতে পারলাম res.json()??
কোকোডোকো

8
@ কোকোডোকো res.json()মূলত একটি শর্টকাট res.text().then(JSON.parse)। উভয়ই একটি প্রতিশ্রুতি ব্যবহার করে ডেটার জন্য অপেক্ষা করে এবং জসনকে বিশ্লেষণ করে।
বার্গি

@ বার্গি, হাই, দুঃখিত আমি কিছু বিভ্রান্তির মুখোমুখি হয়েছি, অর্থাৎ, তখন (res => res.json ()) ব্যবহার করে আমরা জেএসএন পাওয়ার জন্য আরও একটি অনুরোধ প্রেরণ করেছি?
মিরজাল

1
@ আমিরঝাল না, অন্য কোনও অনুরোধ নেই। এটি কেবল পড়ছে (অবিচ্ছিন্নভাবে!) বাকি প্রতিক্রিয়া।
বার্গি

14

এই পার্থক্যটি প্রতিশ্রুতির আচরণের কারণে fetch()বিশেষত বেশি ।

যখন কোনও .then()কলব্যাক অতিরিক্ত ফেরত দেয় Promise, তখন .then()শৃঙ্খলে পরবর্তী কলব্যাকটি মূলত সেই প্রতিশ্রুতিতে আবদ্ধ হয়, এর সংকল্প গ্রহণ করে বা পূর্বাভাস ও মান প্রত্যাখ্যান করে।

২ য় স্নিপেটেও এটি লেখা যেতে পারে:

iterator.then(response =>
    response.json().then(post => document.write(post.title))
);

এই ফর্মটি এবং আপনার উভয় ক্ষেত্রেই এর মান postপ্রদত্ত প্রতিশ্রুতি দ্বারা সরবরাহ করা হয়েছে response.json()


আপনি যখন কোনও সমভূমি ফিরে আসেন Object, তবে, .then()এটি একটি সফল ফলাফল হিসাবে বিবেচনা করে এবং অবিলম্বে নিজেকে সমাধান করে, এর মতো:

iterator.then(response =>
    Promise.resolve({
      data: response.json(),
      status: response.status
    })
    .then(post => document.write(post.data))
);

postএক্ষেত্রে কেবল Objectআপনি তৈরি করেছেন যা Promiseএটির dataসম্পত্তিতে রয়েছে। সেই প্রতিশ্রুতি পূরণের অপেক্ষাই এখনও অসম্পূর্ণ।


7

এছাড়াও, আপনাকে বর্ণিত এই নির্দিষ্ট পরিস্থিতিটি বুঝতে আমাকে কী সাহায্য করেছিল তা হ'ল প্রতিশ্রুতি এপিআই ডকুমেন্টেশন , বিশেষত যেখানে এটি ব্যাখ্যা করে যে thenপদ্ধতিটির মাধ্যমে প্রতিশ্রুত প্রতিশ্রুতি কীভাবে হ্যান্ডলার এফএন প্রদান করবে তার উপর নির্ভর করে কীভাবে পৃথকভাবে সমাধান করা হবে :

যদি হ্যান্ডলার ফাংশন:

  • একটি মান ফেরত দেয়, ততক্ষণে ফিরে আসা প্রতিশ্রুতি তার মান হিসাবে প্রত্যাবর্তিত মানের সাথে সমাধান হয়ে যায়;
  • ত্রুটি নিক্ষেপ করে, ততক্ষণে ফিরে আসা প্রতিশ্রুতি নিক্ষিপ্ত ত্রুটির সাথে তার মূল্য হিসাবে প্রত্যাখ্যান হয়;
  • ইতিমধ্যে সমাধান হওয়া প্রতিশ্রুতি দেয়, ততক্ষণে ফিরে আসা প্রতিশ্রুতি সেই প্রতিশ্রুতির মানটিকে তার মান হিসাবে সমাধান করে;
  • ইতিমধ্যে প্রত্যাখ্যাত প্রতিশ্রুতি দেয়, ততক্ষণে প্রত্যাশিত প্রতিশ্রুতি সেই প্রতিশ্রুতির মানটিকে তার মান হিসাবে প্রত্যাখ্যান করে।
  • অন্য অপেক্ষমান প্রতিশ্রুতি বস্তুটি প্রদান করে, ততক্ষণে ফিরে আসা প্রতিশ্রুতিটির রেজোলিউশন / প্রত্যাখ্যান হ্যান্ডলার কর্তৃক প্রদত্ত প্রতিশ্রুতি সংশোধন / প্রত্যাখ্যানের পরে হবে। এছাড়াও, ততক্ষণে ফিরে আসা প্রতিশ্রুতির মান হ্যান্ডলার দ্বারা ফিরে আসা প্রতিশ্রুতির মান হিসাবে সমান হবে।

5

উপরের উত্তরগুলি ছাড়াও এখানে আপনি কীভাবে জসনকে এনকোড করা একটি ত্রুটি বার্তা পাবেন সেখানে আপনার এপিআই থেকে 500 সিরিজের প্রতিক্রিয়া হ্যান্ডেল করতে পারেন:

function callApi(url) {
  return fetch(url)
    .then(response => {
      if (response.ok) {
        return response.json().then(response => ({ response }));
      }

      return response.json().then(error => ({ error }));
    })
  ;
}

let url = 'http://jsonplaceholder.typicode.com/posts/6';

const { response, error } = callApi(url);
if (response) {
  // handle json decoded response
} else {
  // handle json decoded 500 series response
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.