XMLHttpRequest বনাম API আনুন


163

আমি জানি যে ফেচ এপিআই Promiseগুলি ব্যবহার করে এবং এগুলি উভয়ই আপনাকে একটি সার্ভারে এজেএক্স অনুরোধ করার অনুমতি দেয়।

আমি পড়েছি ফ্যাচ এপিআই-তে কিছু অতিরিক্ত বৈশিষ্ট্য রয়েছে যা XMLHttpRequestএগুলির ভিত্তিতে নেই (এবং এটি আনুন এপিআই পলিফিল-এ, যেহেতু এটি ভিত্তি করে XHR) available

ফেচ এপিআই-তে অতিরিক্ত কী কী ক্ষমতা রয়েছে?


2
যদিও আমি ঘটনাস্থলে প্রত্যাহার করতে পারি না, এক্সএইচআর দিয়ে আপনি করতে পারেন এমন দুটি বা দুটি জিনিস আপনি আনতে পারবেন না। আপনি বলেছিলেন যে আপনি যে পড়ার অতিরিক্ত সম্ভাবনা রয়েছে তা পড়েছেন, সেই নিবন্ধগুলি তারা কী তা না বললে খুব ভাল হয় না
জারোমন্ডা এক্স

2
এক্সএইচআর দিয়ে আপনি যে দুটি জিনিস পেতে পারেন তা আপনি খুঁজে পেতে পারেন ... আনার সময় অনুরোধের সময়সীমা জন্য আপনি নিজের মূল্য নির্ধারণ করতে পারবেন না এবং আপনি অগ্রগতির ইভেন্টগুলিও পেতে পারবেন না
জারোমন্ডা এক্স

3
বেশিরভাগ প্রকারের এক্সএমএলএইচটিপিআরকোয়েস্টগুলির জন্য আনার বিষয়টি সহজ করার সহজ উপায়। যদি আপনার ব্যবহারের ক্ষেত্রে ফ্যাচ যা কিছু ফিট করে তবে এটি ব্যবহার করুন। আপনি যখন একেবারে নীচে নামেন XMLHttpRequest এপিআই বেশিরভাগ লোকেরা এটির জন্যই ব্যবহার করেন না g আনার চেষ্টা করা হয়েছে এমন কাজ করার ক্লিনার উপায়ে অফার করার জন্য যা এক্সএমএলএইচটিপিআরকোয়েস্টকে স্পর্শকাতর করে তুলতে কোনও লাইব্রেরির প্রয়োজন হয় না।
jender00

1
এটি ব্রাউজারগুলিতে খাঁটি সমর্থন পেয়েছে ( caniuse.com/#search=fetch ), সুতরাং এটির জন্য একটি পলিফিল রয়েছে github.com/github/fetch , যা এক্সএইচআর

4
@ মার্কো - আপনি কীভাবে বলতে পারবেন না যে এটি একই কাজটি করার fetch(url).then(function(data) (...));চেয়ে সহজ XMLHttpRequestনয়? এতে অন্যান্য অনেকগুলি বৈশিষ্ট্য থাকতে পারে তবে গীজ, সাধারণ জিনিসগুলির জন্য এটি ব্যবহার করা সহজ sure এটি একটি ক্লিন আপ এপিআই।
jender00

উত্তর:


120

কয়েকটি জিনিস যা আপনি আনতে পারেন তা এক্সএইচআর দিয়ে নয়:

  • আপনি অনুরোধ এবং প্রতিক্রিয়া অবজেক্টের সাহায্যে ক্যাশে API ব্যবহার করতে পারেন;
  • আপনি no-corsঅনুরোধগুলি সম্পাদন করতে পারবেন , এমন কোনও সার্ভারের প্রতিক্রিয়া পেয়ে যা CORS প্রয়োগ করে না। আপনি সরাসরি জাভাস্ক্রিপ্ট থেকে প্রতিক্রিয়া বডিটি অ্যাক্সেস করতে পারবেন না, তবে আপনি অন্যান্য এপিআই (উদাহরণস্বরূপ ক্যাশে এপিআই) দিয়ে এটি ব্যবহার করতে পারেন;
  • স্ট্রিমিং প্রতিক্রিয়া (এক্সএইচআর দিয়ে পুরো প্রতিক্রিয়াটি মেমরির সাথে বাফার হয়, আনার সাথে সাথে আপনি নিম্ন-স্তরের প্রবাহটি অ্যাক্সেস করতে সক্ষম হবেন)। এটি এখনও সমস্ত ব্রাউজারে উপলভ্য নয়, তবে শীঘ্রই হবে।

এক্সএইচআর-এর সাথে আপনি কয়েকটি জিনিস করতে পারেন যা আপনি আনতে এখনও করতে পারেন না, তবে সেগুলি খুব শীঘ্রই বা পরে পাওয়া যাবে ("ভবিষ্যতের উন্নতি" অনুচ্ছেদটি এখানে পড়ুন: https: //hacks.mozilla .org / 2015/03 / এই-এপিআই-তাই-আনছে / ):

  • একটি অনুরোধ বাতিল করুন (এটি এখন ফায়ারফক্স এবং এজে কাজ করে, যেমন @ সিডোশোবার্কার তার মন্তব্যে ব্যাখ্যা করেছেন);
  • অগ্রগতি রিপোর্ট করুন।

এই নিবন্ধটি https://jakearchibald.com/2015/thats-so-fetch/ এ আরও বিশদ বিবরণ রয়েছে।


1
ফেচ এপিআই-এর জন্য অনুমানটি এখন বাতিল করার জন্য সরবরাহ করে। সমর্থন এখন পর্যন্ত ফায়ারফক্স 57 এবং এজ 16 এ প্রেরণ করা হয়েছে Dem ডেমোস: ফেচ-abort-demo-edge.glitch.me , mdn.github.io/dom-example/abort-api । এবং খোলা ক্রোম এবং ওয়েবকিট বৈশিষ্ট্য বাগগুলি রয়েছে bugs.chromium.org/p/chromium/issues/detail?id=750599 , bugs.webkit.org/show_bug.cgi?id=174980 । কীভাবে করবেন: developers.google.com/web/updates/2017/09/abortable-fetch , developer.mozilla.org/en-US/docs/Web/API/AbortSignal# উদাহরণ । এবং উদাহরণস্বরূপ স্ট্যাক ওভারফ্লো উত্তরের স্ট্যাকওভারফ্লো
a/

1
আর একটি পার্থক্য হ'ল fetchঅনুরোধগুলি বিকাশকারী সরঞ্জামগুলিতে পুনরায় প্লে করা যায় না।
পারজিফাল

এবং, আমার অভিজ্ঞতা থেকে, fetchফাইলগুলির জন্য অনুরোধ করতে পারে, তবে এক্সএইচআর করতে পারে না।
ডি পারদল

64

আনা

  • দস্তাবেজগুলি গ্রাস করার জন্য একটি বিল্টিন পদ্ধতি অনুপস্থিত
  • এখনও কোনও টাইমআউট সেট করার উপায় নেই
  • সামগ্রী-ধরণের প্রতিক্রিয়া শিরোনামকে ওভাররাইড করতে পারে না
  • যদি সামগ্রী-দৈর্ঘ্যের প্রতিক্রিয়া শিরোনাম উপস্থিত থাকে তবে তা প্রকাশিত হয় না, স্ট্রিমিংয়ের সময় শরীরের মোট দৈর্ঘ্য অজানা
  • অনুরোধটি সম্পন্ন হয়ে গেলেও সিগন্যালের গর্ভপাত হ্যান্ডলারকে কল করবে
  • কোনও আপলোড অগ্রগতি নেই ( ReadableStreamঅনুরোধ সংস্থা হিসাবে উদাহরণগুলির জন্য সমর্থন এখনও আসেনি )

XHR

  • কুকি না পাঠানোর কোনও উপায় নেই ( অ-মানক mozAnonপতাকা বা নির্মাতা ব্যবহার বাদে AnonXMLHttpRequest)
  • FormDataদৃষ্টান্তগুলি ফিরতে পারে না
  • fetchএর no-corsমোডের সমতুল্য নেই
  • সর্বদা পুনঃনির্দেশগুলি অনুসরণ করুন

13
fetchএছাড়াও অগ্রগতি অনুপস্থিত। progress
এক্সএইচআর

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

@ ক্নু হ্যাঁ এবং এখন আমরা আরও উন্নত এবং আমরা সহজেই একটি 90% সমাধান স্বয়ংক্রিয় করতে পারি এবং ফ্রিক কেসগুলি বিভিন্ন কার্যকারিতার দিকে যেতে দেয়।
অরুবেল

1
@rzr ঠিক নয়, আপনি পেয়েছেন Response#body
নু

9

উপরের উত্তরগুলি ভাল এবং ভাল অন্তর্দৃষ্টি সরবরাহ করে, তবে আমি এই গুগল বিকাশকারীদের ব্লগ এন্ট্রিতে ভাগ করে নেওয়ার মত একই মতামতটি ভাগ করি যে মূল পার্থক্য (ব্যবহারিক দৃষ্টিকোণ থেকে) যে বিল্ট-ইন প্রতিশ্রুতি থেকে ফিরে আসে তার সুবিধাfetch

পরিবর্তে এভাবে কোড লিখতে হবে

function reqListener() {
    var data = JSON.parse(this.responseText);
}

function reqError(err) { ... }

var oReq = new XMLHttpRequest();
oReq.onload = reqListener;
oReq.onerror = reqError;
oReq.open('get', './api/some.json', true);
oReq.send();

আমরা জিনিসগুলি পরিষ্কার করতে পারি এবং প্রতিশ্রুতি এবং আধুনিক সিনট্যাক্স সহ আরও কিছুটা সংক্ষিপ্ত এবং পাঠযোগ্য write

fetch('./api/some.json')
    .then((response) => {
        response.json().then((data) => { 
            ... 
        });
    })
    .catch((err) => { ... });

8
@ অপটটি আপনি আইই ১১-তে বেসিক আনতে সহায়তাটি পলিফিল করতে পারবেন আপনি অনেকগুলি প্রকল্পে যেমন আইই ১১কে একটি সমর্থিত ব্রাউজার হিসাবে ফেলে দিতে পারেন যেমন আইই 11 ব্যবহার এখন 1% এর নীচে।
ডিভন হলকম্ব
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.