জাভাস্ক্রিপ্ট প্রতিশ্রুতি এবং async অপেক্ষার মধ্যে পার্থক্য কি?


103

আমি আমার অ্যাপ্লিকেশনগুলিতে ইতিমধ্যে ECMAScript 6 এবং ECMAScript 7 টি বৈশিষ্ট্য (বাবেলকে ধন্যবাদ) ব্যবহার করছি - মোবাইল এবং ওয়েব উভয়ই।

প্রথম পদক্ষেপটি অবশ্যই ECMAScript 6 স্তরের ছিল। আমি অনেক অ্যাসিঙ্ক প্যাটার্ন, প্রতিশ্রুতি (যা সত্যই আশাব্যঞ্জক), জেনারেটর (নিশ্চিত নয় যে * প্রতীক কেন) ইত্যাদি এগুলির মধ্যে থেকে প্রতিশ্রুতিগুলি আমার উদ্দেশ্যটিকে বেশ ভালভাবে উপযোগী করে তুলেছিল। এবং আমি এগুলিকে আমার অ্যাপ্লিকেশনগুলিতে ব্যবহার করছি।

আমি কীভাবে একটি মৌলিক প্রতিশ্রুতি বাস্তবায়িত করেছি তার একটি উদাহরণ / সিউডোকোড-

var myPromise = new Promise(
    function (resolve,reject) {
      var x = MyDataStore(myObj);
      resolve(x);
    });

myPromise.then(
  function (x) {
    init(x);
});

সময় অতিবাহিত হিসেবে আমি এর নাম ECMAScript জুড়ে 7 বৈশিষ্ট্য, এবং তাদের হচ্ছে একজন এসে ASYNCএবং AWAITকীওয়ার্ড / ফাংশন। এটি একসাথে দুর্দান্ত বিস্ময়কর কাজ করে। আমি আমার কিছু প্রতিশ্রুতি দিয়ে প্রতিস্থাপন শুরু করেছি async & await। তারা প্রোগ্রামিং শৈলীতে দুর্দান্ত মান যোগ করবে বলে মনে হচ্ছে।

আবার, এখানে আমার অ্যাসিঙ্ক, অপেক্ষার ফাংশনটি কেমন দেখাচ্ছে তা একটি সিউডোকোড-

async function myAsyncFunction (myObj) {
    var x = new MyDataStore(myObj);
    return await x.init();
}
var returnVal = await myAsyncFunction(obj);

বাক্য গঠন ত্রুটিগুলি (যদি থাকে) একদিকে রেখে, দুজনেই ঠিক একই জিনিসটি করে যা আমার মনে হয়। আমি প্রায়শই আমার প্রতিশ্রুতিগুলির বেশিরভাগটি async দিয়ে প্রতিস্থাপন করতে সক্ষম হয়েছি, অপেক্ষায় রয়েছে।

প্রতিশ্রুতিবদ্ধ অনুরূপ কাজ করলে কেন অ্যাসিঙ্ক, অপেক্ষা করা দরকার?

Async, একটি বড় সমস্যা সমাধানের জন্য অপেক্ষা করছে? নাকি কলব্যাক নরকের জন্য এটি অন্যরকম সমাধান ছিল?

যেমনটি আমি আগেই বলেছি, আমি প্রতিশ্রুতি এবং অ্যাসিঙ্ক ব্যবহার করতে সক্ষম, একই সমস্যাটি সমাধানের অপেক্ষায়। অ্যাসিঙ্কের অপেক্ষা করার মতো নির্দিষ্ট কিছু আছে কি?

অতিরিক্ত নোট:

আমি আমার রিএ্যাক্ট প্রজেক্ট এবং নোড.জেএস মডিউলগুলিতে ব্যাপকভাবে অ্যাসিঙ্কটি, অপেক্ষা এবং প্রতিশ্রুতি ব্যবহার করছি। প্রতিক্রিয়া বিশেষত একটি প্রাথমিক পাখি হয়ে গেছে এবং প্রচুর ECMAScript 6 এবং ECMAScript 7 বৈশিষ্ট্য গ্রহণ করেছে।


4
আপনার প্রথম কোড ব্লকটি সিঙ্ক্রোনাস অপারেশনের জন্য একটি প্রতিশ্রুতি ব্যবহার করে। তুমি ওটা কেন করবে? সিঙ্ক্রোনাস প্রকৃতির দ্বারা কোড লিখতে সহজ, সুতরাং একটি প্রতিশ্রুতিতে একটি সিঙ্ক্রোনাস অপারেশন গুটিয়ে রাখা এবং এটি এখন async হতে বাধ্য করার পক্ষে সামান্য কারণ থাকতে হবে।
jਫਰ00

@ j বন্ধু00 হ্যাঁ আপনি ঠিক বলেছেন। কোডটি সম্পাদনা করেছেন। ধন্যবাদ
Bozzmob

4
আপনার এখনও সিঙ্ক্রোনাস ফাংশন সহ অ্যাসিঙ্ক সরঞ্জামগুলি ব্যবহার করার চেষ্টা করছেন - এখন উভয় কোড ব্লকেই। কেন?
jفر00

@ jender00 ঠিক আছে এখানে আমার কোড রয়েছে জিস্ট . github.com/bozzmob/26d38b83dc37d1be37f5 । দয়া করে আমাকে বলতে পারেন আমি কী ভুল করছি?
Bozzmob

10
দেখে মনে হচ্ছে অ্যাসিঙ্ক কী এবং অপেক্ষা করার জন্য আপনাকে কেবল একগুচ্ছ পড়া দরকার do এখানে কিছু নিবন্ধ রয়েছে: জাভাস্ক্রিপ্টে অ্যাসিঙ্ক / আওয়েটের দীর্ঘ রাস্তা এবং ES7 অ্যাসিঙ্ক ফাংশন সহ অ্যাসিঙ্ক্রোনাস কোডিং সরলকরণ এবং ES7 সহ অ্যাসিঙ্ক্রোনাস জন্তুকে টেম্পিং করা
jender00

উত্তর:


82

প্রতিশ্রুতিবদ্ধদের অনুরূপ কাজ করলে কেন অ্যাসিঙ্ক, অপেক্ষা করা দরকার? Async, একটি বড় সমস্যা সমাধানের জন্য অপেক্ষা করছে?

async/awaitসহজভাবে আপনাকে অ্যাসিঙ্ক্রোনাস কোডে একটি সুসংগত অনুভূতি দেয়। এটি সিনট্যাকটিকাল চিনির একটি খুব মার্জিত রূপ।

সাধারণ জিজ্ঞাসা এবং ডেটা ম্যানিপুলেশনগুলির জন্য, প্রতিশ্রুতিগুলি সহজ হতে পারে, তবে আপনি যদি এমন জটিল পরিস্থিতিতে ডেটা ম্যানিপুলেশন এবং কী জড়িত না এমন পরিস্থিতিতে দেখেন তবে কোডটি কেবল সংলগ্ন বলে মনে হচ্ছে কি হচ্ছে তা বোঝা সহজ (এটিকে অন্য কোনও উপায়ে বলতে, সিনট্যাক্স ইন এবং নিজেই "ঘটনামূলক জটিলতা" এর এক রূপ যা async/awaitকাছাকাছি যেতে পারে)।

আপনি যদি জানতে আগ্রহী হন coতবে একই ধরণের অনুভূতি দেওয়ার জন্য আপনি (জেনারেটরের পাশাপাশি) লাইব্রেরি ব্যবহার করতে পারেন । async/awaitচূড়ান্তভাবে সমাধান করা (দেশীয়) সমস্যার সমাধান করার জন্য এর মতো বিষয়গুলি বিকাশ করা হয়েছে ।


দয়া করে আপনি "ঘটনামূলক জটিলতা" বলতে কী বোঝাতে পারেন? এছাড়াও, যখন পারফরম্যান্সের কথা আসে তখন কি দুজনের মধ্যে কোনও পার্থক্য নেই?
Bozzmob

@bozzmob, shaffner.us/cs/papers/tarpit.pdf <- তিনি সেখানে " ঘটনামূলক জটিলতা" ব্যাখ্যা করেছেন। আপনার পারফরম্যান্সের প্রশ্ন হিসাবে আমি সন্দেহ করি, বিশেষত ভি 8 ইঞ্জিনটি এটির সাথে। আমি নিশ্চিত এখানে কিছু পারফেক্ট টেস্ট আছে, তবে আমি খুব বেশি চিন্তা করব না। যখন প্রয়োজন হয় না তখন মাইক্রো-অপ্টিমাইজেশনে আপনার সময় নষ্ট করবেন না।
জোশ রশ্মি

4
অনেক ধন্যবাদ! এটি আপনার কাছ থেকে আমি পেয়েছি কিছু দুর্দান্ত তথ্য। এবং হ্যাঁ, মাইক্রো অপ্টিমাইজেশনের দিকে তাকাবে না।
বোজমবব

আমি এই ব্যাখ্যাটি খুঁজে পেয়েছি nikgrozev.com/2015/07/14/…
mwojtera

35

অ্যাসিঙ্ক / অ্যাওয়েট আরও জটিল পরিস্থিতিতে একটি খুব ভাল সিনট্যাক্স সরবরাহ করে। বিশেষ করে, কিছু loops বা মত অন্য কিছু নির্মান সঙ্গে তার আচরণ try/ catch

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

while (!value) {
  const intermediate = await operation1();
  value = await operation2(intermediate);
}

এই উদাহরণটি কেবলমাত্র প্রতিশ্রুতি ব্যবহার করে যথেষ্ট সংশ্লেষিত হবে।


এটি একই বোঝার জন্য একটি দুর্দান্ত উদাহরণ। তো, যখন পারফরম্যান্সের কথা আসে তখন কি দুজনের মধ্যে কোনও পার্থক্য নেই? এবং কোনটি কোডে ব্যবহার করা ভাল? আপনার উদাহরণ কমপক্ষে দেখার পরে অ্যাসিঙ্ক অ্যাওয়েট আরও ভাল বলে মনে হচ্ছে।
Bozzmob

4
@ বোজমোব: পারফরম্যান্সে কোনও পার্থক্য নেই। আপনি যদি অ্যাসিঙ্ক / অপেক্ষা করতে স্বাচ্ছন্দ্য বোধ করেন তবে আমি এটির পরামর্শ দেব। আমি এখনও এটি ব্যবহার করি না কারণ এটি আসলে সরকারী মানের অংশ নয়।
স্টিফেন ক্লিয়ারি

হ্যাঁ, আমি এটিকে মানক একটি অংশ হিসাবে সম্মতি দিচ্ছি না, তবে, রিঅ্যাক্টজেএসের ক্ষেত্রে (স্থানীয়ভাবে বিশেষভাবে প্রতিক্রিয়া জানাতে হবে), আমি কোডের কিছু অংশে এটিকে ব্যবহার করতে বাধ্য হচ্ছি। সুতরাং, তাদের অর্ধেক প্রতিশ্রুতিবদ্ধ এবং অর্ধেকটি অ্যাসিঙ্ক-প্রতীক্ষিত। সুতরাং, আমি আপনাকে এই প্রশ্নগুলি জিজ্ঞাসা করেছি। অভাবী তথ্যের জন্য ধন্যবাদ।
বোজমবব

4
আমি মনে করি যে কেউ যখন তাদের কোডের নমুনায় ট্রাই / ক্যাচ ব্লক ব্যবহার করেন না তখন প্রচুর লোক বিভ্রান্ত হয় এবং / অথবা বিভ্রান্ত হয়।
অগি গার্ডনার

তুমি কি মানে? const getValue = value => value || operation1().then(operation2).then(getValue);
শার্কাক্স

14

প্রতিশ্রুতিবদ্ধদের অনুরূপ কাজ করলে কেন অ্যাসিঙ্ক, অপেক্ষা করা দরকার? Async, একটি বড় সমস্যা সমাধানের জন্য অপেক্ষা করছে? নাকি কলব্যাক নরকের জন্য এটি অন্যরকম সমাধান ছিল? আমি আগেই বলেছি, একই সমস্যা সমাধানের জন্য আমি প্রতিশ্রুতি এবং অ্যাসিঙ্ক, অ্যাওয়েট ব্যবহার করতে সক্ষম। Async Await সমাধান করা আছে যে নির্দিষ্ট কিছু আছে?

প্রথম জিনিসগুলি আপনাকে async/ awaitসিনট্যাক্সটি বুঝতে হবে যে কেবল সিনট্যাকটিক চিনি যা প্রতিশ্রুতি বাড়াতে বোঝানো হয়। আসলে কোনও asyncফাংশনের রিটার্ন মান একটি প্রতিশ্রুতি। async/ awaitসিনট্যাক্স আমাদের সিঙ্ক্রোনাস পদ্ধতিতে অ্যাসিনক্রোনাস লেখার সম্ভাবনা দেয়। এখানে একটি উদাহরণ:

প্রতিশ্রুতি শৃঙ্খল:

function logFetch(url) {
  return fetch(url)
    .then(response => response.text())
    .then(text => {
      console.log(text);
    }).catch(err => {
      console.error('fetch failed', err);
    });
}

Async ফাংশন:

async function logFetch(url) {
  try {
    const response = await fetch(url);
    console.log(await response.text());
  }
  catch (err) {
    console.log('fetch failed', err);
  }
}

উপরের উদাহরণে awaitপ্রতিশ্রুতি ( fetch(url)) এর সমাধান হয় বা প্রত্যাখ্যানের জন্য অপেক্ষা করে। যদি প্রতিশ্রুতিটি সমাধান হয় তবে মানটি responseভেরিয়েবলে সংরক্ষণ করা হয় এবং প্রতিশ্রুতি প্রত্যাখাত হলে এটি একটি ত্রুটি ছুঁড়ে দেয় এবং এইভাবে catchব্লকে প্রবেশ করবে ।

আমরা ইতিমধ্যে দেখতে পাচ্ছি যে প্রতিশ্রুতিবদ্ধ শৃঙ্খলার চেয়ে ব্যবহার async/ ব্যবহার awaitআরও পঠনযোগ্য। এটি বিশেষত সত্য যখন আমরা যে প্রতিশ্রুতিগুলি ব্যবহার করছি তার পরিমাণ বেড়ে যায়। উভয় প্রতিশ্রুতিবদ্ধ শৃঙ্খলাবদ্ধ এবং async/ awaitকলব্যাক হেলকের সমস্যার সমাধান এবং আপনি কোন পদ্ধতিটি পছন্দ করেন তা ব্যক্তিগত পছন্দের বিষয়।


10

ভাল এবং কনস সঙ্গে সম্পূর্ণ তুলনা।

সরল জাভাস্ক্রিপ্ট

  • পেশাদাররা
  • কোন অতিরিক্ত গ্রন্থাগার বা প্রযুক্তি প্রয়োজন হয় না
  • ও'র সেরা পারফরম্যান্স
  • তৃতীয় পক্ষের গ্রন্থাগারগুলির সাথে সামঞ্জস্যের সর্বোত্তম স্তর সরবরাহ করে
  • অ্যাডহক এবং আরও উন্নত অ্যালগরিদম তৈরির অনুমতি দেয়
  • কনস
  • অতিরিক্ত কোড এবং অপেক্ষাকৃত জটিল অ্যালগরিদম প্রয়োজন হতে পারে

অ্যাসিঙ্ক (গ্রন্থাগার)

  • পেশাদাররা
  • সিম্পলি fi সবচেয়ে সাধারণ নিয়ন্ত্রণ fl ওউ নিদর্শন
  • এখনও একটি কলব্যাক-ভিত্তিক সমাধান
  • ভাল পারফরম্যান্স
  • কনস
  • একটি বাহ্যিক নির্ভরতা পরিচয় করিয়ে দেয়
  • উন্নত ow এর জন্য এখনও যথেষ্ট নাও হতে পারে

প্রতিশ্রুতি

  • পেশাদাররা
  • দুর্দান্তভাবে সরল fi ES সর্বাধিক সাধারণ নিয়ন্ত্রণ fl ওউ নিদর্শন
  • শক্ত ত্রুটি পরিচালনা
  • ES2015 স্পেসিফিকেশনের অংশ
  • গ্যারান্টিগুলি পূর্ণ ও অন আক্রান্তের অনুরোধ মুলতবি করেছে
  • কনস
  • কলব্যাক-ভিত্তিক এপিআইয়ের প্রতিশ্রুতি দেওয়ার প্রয়োজন
  • একটি ছোট পারফরম্যান্স হিট পরিচয় করিয়ে দেয়

জেনারেটর

  • পেশাদাররা
  • নন-ব্লকিং এপিআইকে একটি ব্লক করা মত দেখাচ্ছে
  • সিম্পলি error এস ত্রুটি পরিচালনা করে
  • ES2015 অংশ বিশেষ i
  • কনস
  • একটি পরিপূরক নিয়ন্ত্রণ fl ওউ গ্রন্থাগার প্রয়োজন
  • তবুও কলব্যাকগুলি প্রয়োজন বা অ-অনুক্রমিক owগুলি বাস্তবায়নের প্রতিশ্রুতি রয়েছে
  • ননজেনেটর-ভিত্তিক এপিআইগুলিকে থানকিফাই বা প্রচারের প্রয়োজন

অ্যাসিঙ্ক অপেক্ষা করছে

  • পেশাদাররা
  • নন-ব্লকিং এপিআইকে ব্লক করার মতো করে তোলে
  • পরিষ্কার এবং স্বজ্ঞাত সিন্টেক্স
  • কনস
  • বাবেল বা অন্যান্য পরিবহনকারী এবং কিছু কনফারেন্সের প্রয়োজন আজ

এটি কোথা থেকে অনুলিপি করা হয়েছিল? এর কমপক্ষে কিছুটি নোড.জেএস ডিজাইন প্যাটার্নস (দ্বিতীয় সংস্করণ) বইতে (আইএসবিএন-10: 1785885588) বইয়ের 136-137 পৃষ্ঠায় রয়েছে
পিটার মর্টেনসেন

6

আপনার জটিল নিয়ন্ত্রণ প্রবাহের ক্ষেত্রে আপনার কোডটিকে ক্লিনার এবং আরও পঠনযোগ্য করে তুলতে অ্যাসিঙ্ক / অপেক্ষার সাহায্য করতে পারে। এটি আরও ডিবাগ-বান্ধব কোড উত্পাদন করে। এবং উভয়ই সুসংগত এবং অ্যাসিনক্রোনাস ত্রুটি ন্যায়বিচারের সাথে পরিচালনা করতে সক্ষম করে try/catch

আমি সম্প্রতি এই পোস্টটি কোড উদাহরণ সহ কিছু সাধারণ ব্যবহারের ক্ষেত্রে আশ্বাসের প্রতিশ্রুতিগুলি / প্রত্যাশার জন্য অপেক্ষা করে দেখিয়েছি: 6 কারণ কেন জাভাস্ক্রিপ্ট অ্যাসিঙ্ক / অ্যাওয়েট ব্লোস প্রতিশ্রুতি দেয় (টিউটোরিয়াল)

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