নোড.জেএস-এ প্রতিশ্রুতি বোঝা


147

আমি যা বুঝতে পেরেছি সেখান থেকে অ্যাসিক্রোনাস কোড কল করার তিনটি উপায় রয়েছে:

  1. ইভেন্টগুলি, যেমন request.on("event", callback);
  2. কলব্যাকস, উদাঃ fs.open(path, flags, mode, callback);
  3. অঙ্গীকার

আমি নোড-প্রতিশ্রুতি পাঠাগারটি পেয়েছি তবে এটি পাই না।

কেউ কি ব্যাখ্যা করতে পারে যে কোন প্রতিশ্রুতি সম্পর্কে আছে এবং কেন এটি আমার ব্যবহার করা উচিত?

এছাড়াও, কেন এটিকে নোড.জেএস থেকে সরানো হয়েছে?


এই নিবন্ধটি বরং এটি ভাল ব্যাখ্যা। এটা Node.js মধ্যে একটি বাস্তবায়ন ব্যবহারযোগ্য বিষয় আসে, তখন কটাক্ষপাত করা ফিউচার
শন Kinsey

এখানে আমি নিজের প্রতিশ্রুতি শ্রেণি তৈরি করতে একটি দুর্দান্ত সিরিজ ব্যবহার করেছি: আসুন একটি ফ্রেমওয়ার্ক তৈরি করুন: প্রতিশ্রুতি এখানে jQuery সম্পর্কিত ভিডিও: blog.bigbinary.com/2011/09/03/jquery-deferred.html
টম শীত

উত্তর:


91

নোড.জেজে প্রতিশ্রুতি কিছু কাজ করার প্রতিশ্রুতি দিয়েছিল এবং তারপরে পৃথক কলব্যাক ছিল যা সাফল্য এবং ব্যর্থতার পাশাপাশি মৃত্যুর সময়সীমা পরিচালনা করার জন্য কার্যকর করা হবে। নোড.জেএস-এ প্রতিশ্রুতিগুলি ভাবার আরেকটি উপায় হ'ল তারা এমিটার ছিল যা কেবলমাত্র দুটি ইভেন্ট নির্গত করতে পারে: সাফল্য এবং ত্রুটি।

প্রতিশ্রুতি সম্পর্কে দুর্দান্ত জিনিস হ'ল আপনি তাদেরকে নির্ভরতা শৃঙ্খলে একত্রিত করতে পারেন (প্রতিশ্রুতি A এবং প্রতিশ্রুতি বি সম্পূর্ণ হলেই প্রতিশ্রুতি সি করুন )।

এগুলি মূল নোড.জেএস থেকে সরিয়ে দিয়ে, এটি প্রতিশ্রুতির বিভিন্ন বাস্তবায়নের মাধ্যমে মডিউল তৈরির সম্ভাবনা তৈরি করেছে যা মূলের উপরে বসতে পারে। এর কয়েকটি হ'ল নোড-প্রতিশ্রুতি এবং ফিউচার


10
@ ওয়েং না এটা না।
আইভো ওয়েটজেল

98

যেহেতু এই প্রশ্নের এখনও অনেক মতামত রয়েছে (আমার মতো) আমি এটি উল্লেখ করতে চেয়েছিলাম:

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

9
এই github.com/medikoo/deferred দেখুন , কিউ প্রথম এক এবং এটি অবশ্যই পরে বাস্তবায়িত অনেক বাস্তবায়নের অনুপ্রেরণা, কিন্তু দুর্ভাগ্যক্রমে এটি খুব ধীর এবং কিছু অংশে খুব "তাত্ত্বিক", এটি কিছুটির সাথে ভাল খেলছে না some বাস্তব বিশ্বের পরিস্থিতি
মারিউজ নওক

আমি RSVP.js এর নির্মাতাদের এক দ্বারা প্রতিশ্রুতি এই ভিডিওটি খুঁজে বার করো চাই youtube.com/...
runspired

23
২০১৪ আপডেট - ব্লুবার্ডটি এখন পর্যন্ত সবচেয়ে দ্রুত এবং সবচেয়ে ভাল ডিবাগিংয়ের দক্ষতাগুলির মধ্যে একটি।
বেনিয়ামিন গ্রুইনবাউম

19

একটি প্রতিশ্রুতি একটি "জিনিস" যা কথা বলতে কোনও অপারেশনের "পরিণাম" ফলাফল উপস্থাপন করে। এখানে লক্ষণীয় বিষয়টি হ'ল, এটি কখন কী ঘটেছিল তার বিবরণ বিমূ .় করে এবং আপনাকে কিছু ঘটে যাওয়ার পরে কী ঘটবে সে সম্পর্কে ফোকাস করার অনুমতি দেয় । এটি পরিষ্কার, রক্ষণাবেক্ষণযোগ্য কোডে ফলাফল করবে যেখানে কলব্যাকের অভ্যন্তরে কলব্যাকের অভ্যন্তরে কলব্যাকের পরিবর্তে আপনার কোডটি কিছুটা দেখতে দেখতে পাওয়া যাবে:

 var request = new Promise(function(resolve, reject) {
   //do an ajax call here. or a database request or whatever.
   //depending on its results, either call resolve(value) or reject(error)
   //where value is the thing which the operation's successful execution returns and
   //error is the thing which the operation's failure returns.
 });

 request.then(function successHandler(result) {
   //do something with the result
 }, function failureHandler(error) {
  //handle
 });

প্রতিশ্রুতিগুলির নির্দিষ্ট বিবরণে বলা হয়েছে যে একটি প্রতিশ্রুতি রয়েছে

then

প্রদত্ত সাফল্যহ্যান্ডলার বা ব্যর্থতাহ্যান্ডলার কলব্যাক শেষ হলে পদ্ধতিটি একটি নতুন প্রতিশ্রুতি ফিরে আসে should এর অর্থ হ'ল আপনি যখন অ্যাসিক্রোনাস কাজগুলির একটি সেট প্রস্তুত করেন এবং আপনি নিশ্চিত হন যে আপনি কলব্যাকগুলি ব্যবহার করেছেন ঠিক তেমন ক্রিয়াকলাপের ক্রমটি গ্যারান্টিযুক্ত রয়েছে তখন আপনি প্রতিশ্রুতিগুলি একসাথে চেইন করতে পারেন। সুতরাং কলব্যাকের অভ্যন্তরে কলব্যাকের অভ্যন্তরে একটি কলব্যাক পাস করার পরিবর্তে শিকলযুক্ত প্রতিশ্রুতি সহ কোডটি মনে হয়:

var doStuff = firstAsyncFunction(url) {
                return new Promise(function(resolve, reject) {
                       $.ajax({
                        url: url,
                        success: function(data) {
                            resolve(data);
                        },
                        error: function(err) {
                             reject(err); 
                        } 
                  });
               };
doStuff
  .then(secondAsyncFunction) //returns a promise
  .then(thirdAsyncFunction); //returns a promise

প্রতিশ্রুতি ব্যাপারে আরো জানতে এবং কেন তারা প্রচন্ড cool আছে, Domenic এর ব্লগ চেকআউট: http://domenic.me/2012/10/14/youre-missing-the-point-of-promises/


12

পাউচডিবি এর লেখকের প্রতিশ্রুতি সম্পর্কিত এই নতুন টিউটোরিয়ালটি সম্ভবত আমি কোথাও সেরা দেখেছি। এটি বুদ্ধিমানের সাথে আপনাকে সঠিক ব্যবহারের ধরণগুলি এবং এমনকী কিছু অ্যান্টি-প্যাটার্নগুলি দেখায় যা এখনও সাধারণভাবে ব্যবহৃত হয় - এমনকি অন্যান্য টিউটোরিয়ালেও অন্তর্ভুক্ত করে !!

উপভোগ করুন!

PS আমি এই প্রশ্নের অন্য কিছু অংশের উত্তর দেয়নি কারণ তারা অন্যদের দ্বারা ভালভাবে কভার করা হয়েছে।


এর জন্য আমার একমাত্র ক্ষমা চাই উন্নত ভুল # 4 এর শেষে আপনাকে হাস্যরস পড়তে বাধ্য করা।
টনি ও'হাগান

প্রকৃতপক্ষে, টিউটোরিয়ালের যে কোডটি তারা অ্যান্টিপ্যাটার্ন বলে দাবি করে তার জন্য লুপ এবং শর্তের জন্য বাসা বাঁধতে হবে এবং তাদের পরামর্শ মতো সহজেই সমতল হতে পারে না।
বার্গি 21

উন্নত ভুল # 4 টি আরও বেশি সংখ্যক পদ্ধতির ব্যবহার করেও সমাধান করা যেতে পারে, দেখুন।। (চেইনে) পূর্ববর্তী প্রতিশ্রুতি ফলাফলগুলিতে আমি কীভাবে অ্যাক্সেস করব? ( তারা যে ক্লোজার প্যাটার্নটির পরামর্শ দেয় তা খুব জনপ্রিয় বলে মনে হচ্ছে না)।
বার্গি 21

আমি মনে করি এই লিঙ্ক-উত্তরটি আরও ভালভাবে মন্তব্য করা উচিত ছিল। আপনার উত্তরটিতে দয়া করে নিবন্ধের মূল পয়েন্টগুলি এখানে রাখুন।
বার্গি 21

7

উইনজেএস প্রতিশ্রুতি গ্রন্থাগার কীভাবে কাজ করে তা বর্ণনা করে মাইক টাক্টির একটি ভিডিও রয়েছে যা তাদের দশ মিনিটেরও কম লম্বা ভিডিও রয়েছে

এই ভিডিওগুলি বেশ তথ্যবহুল এবং মাইক কয়েকটি ভাল-নির্বাচিত কোড উদাহরণ সহ প্রতিশ্রুতি এপিআইয়ের শক্তি দেখাতে পরিচালনা করে।

var twitterUrl = "http://search.twitter.com/search.json?q=windows";
var promise = WinJS.xhr({ url: twitterUrl });

 promise = promise.then(
     function (xhr) {
     },
     function (xhr) {
         // handle error
     });

ব্যতিক্রমগুলি কীভাবে মোকাবেলা করা হয় তার চিকিত্সা বিশেষত ভাল।

উইনজেস উল্লেখ থাকা সত্ত্বেও, এটি একটি সাধারণ আগ্রহের ভিডিও সিরিজ, কারণ প্রতিশ্রুতিবদ্ধ এপিআই এর বহু বাস্তবায়ন জুড়ে বিস্তৃতভাবে সমান।

আরএসভিপি একটি হালকা ওজনের প্রতিশ্রুতি প্রয়োগ যা প্রতিশ্রুতি / এ + পরীক্ষার স্যুটটি পাস করে passes আমি বেশিরভাগই এপিআই পছন্দ করি কারণ এটি উইনজেএস ইন্টারফেসের মতো শৈলীতে।

আপডেট এপ্রিল -2014

ঘটনাচক্রে, উইনজেএস লাইব্রেরি এখন উন্মুক্ত উত্স


1
+1 টি। এই প্রথম উদাহরণ আমি দেখেছি করে নির্মিত হয় আমাকে জ্ঞান ব্যবহার করতে স্বজ্ঞাত। একরকম আমার মস্তিষ্কের সব বিশ্লেষণ করতে পারি না deferredsএবং resolveএবং deferred.promise.thenএবং predefining promiseActionsজনপ্রিয় প্রশ্ন গ্রন্থাগার ডকুমেন্টেশনে। নোড.জেএস এর জন্য আপনি কিছু সোজা কিছু জানতে চান ?
রেডসান্দ্রো

1
@ নোয়েল উপরের লিঙ্কটি ভাগ করে নেওয়ার জন্য আপনাকে ধন্যবাদ, এটি প্রতিশ্রুতির জন্য একটি দুর্দান্ত সূচনা সিরিজ, এবং আমি সম্মত হই যে উইনজেএসের বিবরণ সামগ্রিক পন্থা / বিষয় সর্বজনীন হওয়ায় এটি অপ্রাসঙ্গিক।
আর্কসেল্ডন

চমৎকার উদাহরণ। এছাড়াও আমি আপনার প্রথম লিঙ্কটি স্থির করে দিয়েছিলাম যা মারা গিয়েছিল
oned

5

প্রতিশ্রুতিগুলির আরেকটি সুবিধা হ'ল ত্রুটি পরিচালনা এবং ব্যতিক্রম নিক্ষেপ করা এবং ধরা কলব্যাক সহ এটি পরিচালনা করার চেষ্টা করার চেয়ে অনেক ভাল।

Bluebird গ্রন্থাগার কার্যকরী প্রতিশ্রুতি এবং আপনি মহান দীর্ঘ স্ট্যাক ট্রেস দেয়, খুব দ্রুত, এবং uncaught ত্রুটি সম্পর্কে সতর্ক করে। এটি আরও দ্রুত এবং অন্যান্য প্রতিশ্রুতি গ্রন্থাগারগুলির তুলনায় কম স্মৃতি ব্যবহার করে, http://bluebirdjs.com/docs/benchmark.html


4

প্রতিশ্রুতি ঠিক কী?

একটি প্রতিশ্রুতি কেবল এমন একটি জিনিস যা অ্যাসিঙ্ক অপারেশনের ফলাফলকে উপস্থাপন করে। প্রতিশ্রুতি নিম্নলিখিত 3 টির মধ্যে যে কোনও একটিতে হতে পারে:

মুলতুবি :: এটি প্রাথমিক অবস্থা, এর অর্থ প্রতিশ্রুতিও পূরণ হয় না বা প্রত্যাখ্যানও হয় না।

পরিপূর্ণ :: এর অর্থ প্রতিশ্রুতি পূর্ণ হয়েছে, অর্থ প্রতিশ্রুতি দ্বারা প্রতিনিধিত্ব করা মানটি ব্যবহারের জন্য প্রস্তুত।

প্রত্যাখাত :: এর অর্থ অপারেশনগুলি ব্যর্থ হয়েছে এবং সে কারণে প্রতিশ্রুতি পূর্ণ করতে পারে না। রাজ্যগুলি বাদে, প্রতিশ্রুতিগুলির সাথে যুক্ত তিনটি গুরুত্বপূর্ণ সত্ত্বা রয়েছে যা আমাদের সত্যই বুঝতে হবে

  1. এক্সিকিউটার ফাংশন :: এক্সিকিউটার ফাংশন async অপারেশনকে সংজ্ঞায়িত করে যা সম্পাদন করা প্রয়োজন এবং যার ফলাফল প্রতিশ্রুতি দ্বারা প্রতিনিধিত্ব করা হয়। প্রতিশ্রুতি বস্তুটি শুরু হওয়ার সাথে সাথে এটি কার্যকর করা শুরু করে।

  2. রেজাল্ট :: রেজোলিউশন হল এক্সিকিউটারের ফাংশনে পাস হওয়া একটি পরামিতি, এবং যদি এক্সিকিউটার সফলভাবে চালায় তবে এই রেজোলিউশনটিকে রেজাল্ট পাস করা বলা হয়।

  3. প্রত্যাখ্যান :: প্রত্যাখ্যান করা হল এক্সিকিউটার ফাংশনে পাস করা অন্য প্যারামিটার, এবং যখন এক্সিকিউটার ফাংশন ব্যর্থ হয় তখন এটি ব্যবহৃত হয়। ব্যর্থতার কারণ প্রত্যাখ্যান করা যেতে পারে।

সুতরাং যখনই আমরা একটি প্রতিশ্রুতি বস্তু তৈরি করি, তখন আমাদের নির্বাহক, সমাধান এবং প্রত্যাখ্যান করতে হবে।

রেফারেন্স :: প্রতিশ্রুতি


0

আমি সম্প্রতি node.js এ প্রতিশ্রুতিও সন্ধান করেছি। ডেট করার জন্য, যখন.জেএস এর গতি এবং সংস্থান ব্যবহারের কারণে যাওয়ার পথে চলেছে বলে মনে হচ্ছে, তবে Q.js এর নথিভুক্তি আমাকে আরও অনেক ভাল বোঝার সুযোগ দিয়েছে। সুতরাং বিষয়টি বুঝতে কখন j.js তবে q.js ডক্স ব্যবহার করুন।

গিথুবে রিডমে কিউজে থেকে :

যদি কোনও ফাংশন কোনও মান ফেরত দিতে বা অবরুদ্ধকরণ ব্যতীত কোনও ব্যতিক্রম ছুঁড়তে না পারে, তবে পরিবর্তে কোনও প্রতিশ্রুতি দিতে পারে। প্রতিশ্রুতি এমন কোনও বস্তু যা প্রত্যাবর্তন মান বা ফাংশনটি শেষ পর্যন্ত সরবরাহ করতে পারে এমন ছোঁড়া ব্যতিক্রমকে উপস্থাপন করে। একটি প্রতিশ্রুতি বিলম্বিততা কাটিয়ে উঠতে প্রত্যন্ত বস্তুর প্রক্সি হিসাবেও ব্যবহার করা যেতে পারে।


0

প্রতিশ্রুতি বস্তু একটি অ্যাসিক্রোনাস ক্রিয়াকলাপের সমাপ্তি বা ব্যর্থতা উপস্থাপন করে।

সুতরাং একটি প্রতিশ্রুতি বাস্তবায়নের জন্য আপনার দুটি অংশ প্রয়োজন: -

1. প্রতিশ্রুতি তৈরি:

প্রতিশ্রুতিবদ্ধ কনস্ট্রাক্টর একটি এক্সিকিউটার নামে পরিচিত একটি ফাংশন গ্রহণ করে যার 2 টি পরামিতি সমাধান এবং প্রত্যাখ্যান করে।

function example(){
   return new Promise (function(resolve , reject){   //return promise object
      if(success){
         resolve('success');  //onFullfiled
      }else{
         reject('error');     //onRejected
      }
   })
}

2. প্রতিশ্রুতি পরিচালনা:

প্রতিশ্রুতি অবজেক্টে প্রতিশ্রুতিবদ্ধ বস্তুগুলি পরিচালনা করার জন্য 3 টি পদ্ধতি রয়েছে: -

1.Promise.prototype.catch (onRejected)

2.Promise.prototype.then (onFullfiled)

3.Promise.prototype.finally (onFullfiled, onRejected)

example.then((data) =>{
  //handles resolved data
  console.log(data); //prints success     
}).catch((err) => {
  //handles rejected error 
  console.log(err);  //prints error
})
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.