প্রতিশ্রুতি শুধু কলব্যাক হয় না?


430

আমি কয়েক বছর ধরে জাভাস্ক্রিপ্ট বিকাশ করছি এবং প্রতিশ্রুতি সম্পর্কে হট্টগোল আমি মোটেই বুঝতে পারি না।

মনে হচ্ছে আমি যা করি তা পরিবর্তন:

api(function(result){
    api2(function(result2){
        api3(function(result3){
             // do work
        });
    });
});

যা আমি যে কোনও উপায়ে async এর মতো লাইব্রেরি ব্যবহার করতে পারি , এর মতো কিছু সহ:

api().then(function(result){
     api2().then(function(result2){
          api3().then(function(result3){
               // do work
          });
     });
});

যা বেশি কোড এবং কম পঠনযোগ্য। আমি এখানে কিছুই অর্জন করতে পারি না, এটি হঠাৎ জাদুকরীভাবে 'ফ্ল্যাট' নয়। জিনিসগুলিকে প্রতিশ্রুতিতে রূপান্তর করার কথা উল্লেখ না করে।

সুতরাং, এখানে প্রতিশ্রুতি সম্পর্কে বড় কলহ কি?



2
ফাই আপনি যে উত্তরটি গ্রহণ করেছেন তা হ'ল তুচ্ছ সুবিধার একই পুরানো তালিকা যা প্রতিশ্রুতির বিন্দু নয় এবং এমনকি প্রতিশ্রুতিগুলি ব্যবহার করতে আমাকে রাজি করেনি: /। অস্কারের উত্তরে বর্ণিত ডিএসএল দিকটি আমাকে প্রতিশ্রুতিগুলি ব্যবহার করতে কীসের
তাগিদ দিয়েছে

@ ইসাইলিহ ঠিক আছে, আপনার লেট বক্তৃতা আমাকে বোঝায়। আমি অন্য উত্তরটি গ্রহণ করেছি যদিও আমি মনে করি বার্গির একটি খুব ভাল (এবং ভিন্ন) পয়েন্টও উত্থাপন করেছে।
বেনিয়ামিন গ্রুইনবাউম

@ ইসাইলিজা "অস্কারের উত্তরে বর্ণিত ডিএসএল দিকটি কী আমাকে প্রতিশ্রুতি প্রয়োগ করতে বাধ্য করেছিল" << "ডিএসএল" কী? এবং আপনি যে "ডিএসএল দিক" উল্লেখ করছেন?
Monsto

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

উত্তর:


631

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

api().then(function(result){
    return api2();
}).then(function(result2){
    return api3();
}).then(function(result3){
     // do work
});

অবশ্যই, খুব কম কোড নয়, তবে অনেক বেশি পাঠযোগ্য।

কিন্তু এই শেষ নয়। আসুন আসল সুবিধাগুলি আবিষ্কার করুন: আপনি যদি কোনও পদক্ষেপে কোনও ত্রুটি পরীক্ষা করতে চান তবে কী হবে? কলব্যাক দিয়ে এটি করা জাহান্নাম হবে, কিন্তু প্রতিশ্রুতি সহ, এটি একটি কেকের টুকরা:

api().then(function(result){
    return api2();
}).then(function(result2){
    return api3();
}).then(function(result3){
     // do work
}).catch(function(error) {
     //handle any error that may occur before this point
});

বেশ try { ... } catchব্লক হিসাবে একই ।

আর ভালো:

api().then(function(result){
    return api2();
}).then(function(result2){
    return api3();
}).then(function(result3){
     // do work
}).catch(function(error) {
     //handle any error that may occur before this point
}).then(function() {
     //do something whether there was an error or not
     //like hiding an spinner if you were performing an AJAX request.
});

আর আরও ভাল যদি ঐ 3 কল কি api, api2, api3একযোগে চালাতে পারে (যেমন যদি তারা AJAX এর কল ছিল) কিন্তু আপনি তিনটি জন্য অপেক্ষা করতে প্রয়োজন? প্রতিশ্রুতি ব্যতীত আপনার কোনওরকম কাউন্টার তৈরি করতে হবে। প্রতিশ্রুতি সহ, ES6 স্বরলিপি ব্যবহার করে, এটি কেকের আরও একটি টুকরো এবং বেশ ঝরঝরে:

Promise.all([api(), api2(), api3()]).then(function(result) {
    //do work. result is an array contains the values of the three fulfilled promises.
}).catch(function(error) {
    //handle the error. At least one of the promises rejected.
});

আশা করি আপনি এখন একটি নতুন আলোতে প্রতিশ্রুতি দেখতে পাবেন।


124
তাদের সত্যই এটি "প্রতিশ্রুতি" হিসাবে নামকরণ করা উচিত নয়। "ভবিষ্যত" কমপক্ষে 100x আরও ভাল।
পেসেরিয়র

12
@ পেসারিয়ার কারণ ফিউচারটি jQuery দ্বারা কলঙ্কিত হয়নি?
ইসাইলিজা

5
বিকল্প প্যাটার্ন (যা পছন্দসই তার উপর নির্ভর করে: এপিআই ()। তারপরে (এপিআই 2)। তারপর (এপিআই 3) .তখন (ডু ওয়ার্ক); অর্থাৎ, যদি এপিআই 2 / এপি 3 ফাংশনগুলি সর্বশেষ পদক্ষেপ থেকে ইনপুট নেয় এবং নতুন প্রতিশ্রুতিগুলি তারা ফিরে দেয়, তারা । শুধু অতিরিক্ত মোড়ানো ছাড়া শৃঙ্খলিত করা যায় যে তারা রচনা করে।
Dtipson

1
যদি সেখানে অ্যাসিঙ্ক অপারেশন হয় api2এবং api3? .thenএই অসিঙ্ক অপারেশনগুলি শেষ হয়ে গেলে কি কেবল শেষ বলা হবে?
নিকক নিউম্যান

8
আপনি আমাকে ট্যাগ করলেন কেন? আমি ব্যাকরণটি কিছুটা ঠিক করেছি। আমি জেএস বিশেষজ্ঞ নই। :)
স্কট আর্কিসজেউস্কি

169

হ্যাঁ, প্রতিশ্রুতি অ্যাসিক্রোনাস কলব্যাক। কলব্যাকগুলি যা কিছু করতে পারে না সেগুলি তারা করতে পারে না এবং আপনি প্লে কলব্যাকের মতো অ্যাসিনক্রোনির ক্ষেত্রেও একই সমস্যার মুখোমুখি হন।

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

তাহলে মূল ধারণাটি কী?

প্রতিশ্রুতি হ'ল একটি একক (অ্যাসিনক্রোনাস) গণনার ফলাফলকে উপস্থাপনকারী বস্তু। তারা সমাধান যে ফলাফল একবারে । এর অর্থ কয়েকটি জিনিস রয়েছে:

একটি পর্যবেক্ষক নিদর্শন বাস্তবায়নের প্রতিশ্রুতি দেয়:

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

প্রতিশ্রুতিগুলি শৃঙ্খলযোগ্য ( একাকী , যদি আপনি চান ):

  • যদি আপনাকে কোনও প্রতিশ্রুতির প্রতিনিধিত্ব করে এমন মানটি রূপান্তর করতে হয় তবে আপনি প্রতিশ্রুতির উপরে রূপান্তর ফাংশনটি মানচিত্র করুন এবং রূপান্তরিত ফলাফলকে উপস্থাপন করে এমন একটি নতুন প্রতিশ্রুতি ফিরে পাবেন। আপনি এটি কোনওভাবে সিঙ্ক্রোনালি ব্যবহারের জন্য মানটি পেতে পারেন না তবে আপনি সহজেই তুলতে পারেন প্রতিশ্রুতি প্রেক্ষাপটে রূপান্তর। কোনও বয়লারপ্লেট কলব্যাক নেই।
  • আপনি যদি দুটি অ্যাসিনক্রোনাস টাস্ক চেইন করতে চান তবে আপনি এই .then()পদ্ধতিটি ব্যবহার করতে পারেন । এটি প্রথম ফলাফলের সাথে কল করতে একটি কলব্যাক নেবে এবং কলব্যাক যে প্রতিশ্রুতি দেয় তার ফলাফলের জন্য একটি প্রতিশ্রুতি দেয়।

জটিল মনে হচ্ছে? একটি কোড উদাহরণের জন্য সময়।

var p1 = api1(); // returning a promise
var p3 = p1.then(function(api1Result) {
    var p2 = api2(); // returning a promise
    return p2; // The result of p2 …
}); // … becomes the result of p3

// So it does not make a difference whether you write
api1().then(function(api1Result) {
    return api2().then(console.log)
})
// or the flattened version
api1().then(function(api1Result) {
    return api2();
}).then(console.log)

সমতলকরণ যাদুতে আসে না তবে আপনি এটি সহজেই করতে পারেন। আপনার ভারী নেস্টেড উদাহরণের জন্য, (কাছাকাছি) সমতুল্য হবে

api1().then(api2).then(api3).then(/* do-work-callback */);

যদি এই পদ্ধতির কোডটি বোঝার ক্ষেত্রে সহায়তা করে তবে কয়েকটি লাইনে এটি একটি সর্বাধিক বুনিয়াদি প্রতিশ্রুতিবদ্ধ

প্রতিশ্রুতি সম্পর্কে বড় কলহ কি?

প্রতিশ্রুতি বিমূর্তি কার্যকারিতা আরও ভাল মিশ্রণযোগ্যতা অনুমতি দেয়। উদাহরণস্বরূপ, thenশৃঙ্খলার জন্য পরবর্তী , allফাংশনটি একাধিক সমান্তরাল-অপেক্ষার প্রতিশ্রুতিগুলির সম্মিলিত ফলাফলের জন্য একটি প্রতিশ্রুতি তৈরি করে।

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

জিনিসগুলিকে প্রতিশ্রুতিতে রূপান্তর করার কথা উল্লেখ না করে।

এটি আসলে ভাল প্রতিশ্রুতি গ্রন্থাগারগুলি সহ বেশ তুচ্ছ, দেখুন কীভাবে আমি বিদ্যমান কলব্যাক এপিআইকে প্রতিশ্রুতিতে রূপান্তর করব?


হাই বার্গি, আপনার কী এই প্রশ্নটি যুক্ত করার জন্য আকর্ষণীয় কিছু আছে? stackoverflow.com/questions/22724883/…
সেবাস্তিয়ান লরবার

1
@ সেবাস্তিয়ান: আমি স্ক্যালার (এখনও) সম্পর্কে খুব বেশি কিছু জানি না, এবং আমি কেবল বেঞ্জামিন যা বলেছিলাম তা পুনরাবৃত্তি করতে পেরেছিলাম :-)
বার্গি

3
কেবলমাত্র একটি মন্তব্য: আপনি ব্যবহার করতে পারবেন না .then(console.log), কারণ কনসোল.লগ কনসোল প্রসঙ্গে নির্ভর করে। এইভাবে এটি একটি অবৈধ অনুরোধ ত্রুটির কারণ হবে। প্রসঙ্গটি console.log.bind(console)বা x => console.log(x)বাঁধতে ব্যবহার করুন ।
তামাস হেজেডাস

3
@ হেজ_হেগডাস: যেখানে পরিবেশ রয়েছে console পদ্ধতিগুলি ইতিমধ্যে আবদ্ধ। এবং অবশ্যই, আমি কেবল বলেছি যে উভয়ের নেস্টিংয়ের ঠিক একই আচরণ রয়েছে, তাদের মধ্যে কেউ কাজ করবে না :
পি

1
এটা দুর্দান্ত ছিল। এটি আমার প্রয়োজন: কম কোড এবং আরও ব্যাখ্যা। ধন্যবাদ.
অ্যাডাম প্যাটারসন

21

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

api().then(result => api2()).then(result2 => api3()).then(result3 => console.log(result3))

অলিগোফ্রেন যেমন উল্লেখ করেছেন, এপিআই কলগুলির মধ্যে তর্ক ছাড়াই আপনার বেনামে মোড়কের কোনও কাজ করার দরকার নেই:

api().then(api2).then(api3).then(r3 => console.log(r3))

এবং অবশেষে, আপনি যদি একটি সুপারম্যাসিভ ব্ল্যাকহোল স্তরে পৌঁছতে চান তবে প্রতিশ্রুতিগুলি অপেক্ষা করা যেতে পারে:

async function callApis() {
    let api1Result = await api();
    let api2Result = await api2(api1Result);
    let api3Result = await api3(api2Result);

    return api3Result;
}

9
"ES6 তীর ফাংশন সহ প্রতিশ্রুতিগুলি একটি বিনীতভাবে জ্বলজ্বল ছোট নীল তারা থেকে সরাসরি একটি লাল দৈত্যে পরিণত হয় That এটি একটি সুপারনোভাতে পড়তে
চলেছে

3
এটি প্রতিশ্রুতিগুলি মহাজাগতিক বিপর্যয়ের মতো শব্দ করে তোলে, যা আমি মনে করি না যে আপনার উদ্দেশ্য ছিল।
মাইকেল ম্যাকগিনিস

আপনি আর্গুমেন্ট ব্যবহার না করেন তাহলে apiXপদ্ধতি, ভাল হিসাবে আপনি পুরাপুরি তীর ফাংশন লাফালাফি করতে পারেন: api().then(api2).then(api3).then(r3 => console.log(r3))
অলিগোফ্রেন

@ মিশেল ম্যাকগিনিস - একটি নিস্তেজ কলব্যাক নরকের প্রতিশ্রুতির উপকারী প্রভাব স্থানের অন্ধকার কোণে বিস্ফোরিত সুপারনোভার মতো like
জন ওয়েইজ

আমি জানি আপনি এটি কাব্যিকভাবে বোঝাতে চেয়েছিলেন তবে প্রতিশ্রুতিগুলি "সুপারনোভা" থেকে অনেক দূরে। মোনাডিক আইন ভঙ্গ করা বা আরও শক্তিশালী ব্যবহারের ক্ষেত্রে সমর্থন না থাকা যেমন বাতিলকরণ বা একাধিক মান ফেরত দেওয়ার বিষয়টি মাথায় আসে।
দিমিত্রি জায়তসেভ

15

উপরের দুর্দান্ত উত্তরগুলি ছাড়াও আরও 2 টি পয়েন্ট যুক্ত করা যেতে পারে:

1. অর্থগত পার্থক্য:

প্রতিশ্রুতিগুলি ইতিমধ্যে সৃষ্টির পরে সমাধান করা যেতে পারে। এর অর্থ তারা ইভেন্টের চেয়ে শর্তের গ্যারান্টি দেয় । যদি সেগুলি ইতিমধ্যে সমাধান করা হয় তবে এটিতে পাস করা সমাধান ফাংশনটি এখনও ডাকা হয়।

বিপরীতে, কলব্যাকগুলি ইভেন্টগুলি পরিচালনা করে। সুতরাং, আপনি যে ইভেন্টটিতে আগ্রহী তা যদি কলব্যাকটি নিবন্ধিত হওয়ার আগে ঘটে থাকে তবে কলব্যাক কল করা হবে না।

2. নিয়ন্ত্রণের বিপরীত

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

পড়ুন জাভাস্ক্রিপ্ট ইভেন্ট লুপ একটি ব্যাখ্যা জন্য।

সঙ্গে অঙ্গীকার , নিয়ন্ত্রণ কলিং প্রোগ্রামের সাথে থাকা। আমরা যদি প্রতিশ্রুতিবদ্ধ বস্তুটি সঞ্চয় করি তবে। টি () পদ্ধতিটি যে কোনও সময় বলা যেতে পারে


1
কেন জানি না তবে এটিকে আরও ভাল উত্তর বলে মনে হচ্ছে।
রেডিয়ান্টশো

13

অন্যান্য উত্তরগুলির পাশাপাশি, ES2015 সিনট্যাক্স আরও বেশি বয়লারপ্লেট কোড হ্রাস করে প্রতিশ্রুতিগুলির সাথে নির্বিঘ্নে মিশে যায়:

// Sequentially:
api1()
  .then(r1 => api2(r1))
  .then(r2 => api3(r2))
  .then(r3 => {
      // Done
  });

// Parallel:
Promise.all([
    api1(),
    api2(),
    api3()
]).then(([r1, r2, r3]) => {
    // Done
});

5

প্রতিশ্রুতি কলব্যাক নয়, দুটোই প্রোগ্রামিং আইডিয়াম যা অ্যাসিঙ্ক প্রোগ্রামিংকে সহজতর করে। প্রতিস্থাপন প্রতিশ্রুতি তৃতীয় যেমন একটি মূর্খ হিসাবে বিবেচনা করা যেতে পারে যে coroutines বা জেনারেটর ব্যবহার করে একটি অ্যাসিঙ্ক / অপেক্ষার স্টাইল প্রোগ্রামিং ব্যবহার করে। বিভিন্ন প্রোগ্রামিং ভাষা (জাভাস্ক্রিপ্ট সহ) জুড়ে এই প্রতিমাগুলির তুলনাটি এখানে: https://github.com/KjellSchubert/promise-future-task


4

একদম না.

কলব্যাকগুলি জাভাস্ক্রিপ্টে কেবল ফাংশন যা কল করতে হবে এবং তারপরে অন্য ফাংশন কার্যকর হওয়ার পরে কার্যকর করা হবে। তাহলে কীভাবে হয়?

প্রকৃতপক্ষে, জাভাস্ক্রিপ্টে, ফাংশনগুলিকে নিজেই অবজেক্ট হিসাবে বিবেচনা করা হয় এবং তাই অন্য সমস্ত অবজেক্ট হিসাবে, এমনকি ফাংশনগুলি অন্যান্য ফাংশনে আর্গুমেন্ট হিসাবে প্রেরণ করা যেতে পারে । সবচেয়ে সাধারণ এবং জেনেরিক ব্যবহারের ক্ষেত্রে আপনি জাভাস্ক্রিপ্টে সেটটাইমআউট () ফাংশনটি ভাবতে পারেন।

অঙ্গীকার কলব্যাকগুলির সাথে একই কাজ করার তুলনায় অ্যাসিক্রোনাস কোড পরিচালনা এবং কাঠামোগত গঠনের অনেক বেশি উন্নত পদ্ধতি ছাড়া কিছুই নয়।

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


2

কোনও প্রতিশ্রুতি কেবল কলব্যাকগুলিতে মোড়ক নয়

উদাহরণস্বরূপ আপনি নোড জেএস সহ জাভাস্ক্রিপ্ট নেটিভ প্রতিশ্রুতি ব্যবহার করতে পারেন

my cloud 9 code link : https://ide.c9.io/adx2803/native-promises-in-node

/**
* Created by dixit-lab on 20/6/16.
*/

var express = require('express');
var request = require('request');   //Simplified HTTP request client.


var app = express();

function promisify(url) {
    return new Promise(function (resolve, reject) {
    request.get(url, function (error, response, body) {
    if (!error && response.statusCode == 200) {
        resolve(body);
    }
    else {
        reject(error);
    }
    })
    });
}

//get all the albums of a user who have posted post 100
app.get('/listAlbums', function (req, res) {
//get the post with post id 100
promisify('http://jsonplaceholder.typicode.com/posts/100').then(function (result) {
var obj = JSON.parse(result);
return promisify('http://jsonplaceholder.typicode.com/users/' + obj.userId + '/albums')
})
.catch(function (e) {
    console.log(e);
})
.then(function (result) {
    res.end(result);
}
)

})


var server = app.listen(8081, function () {

var host = server.address().address
var port = server.address().port

console.log("Example app listening at http://%s:%s", host, port)

})


//run webservice on browser : http://localhost:8081/listAlbums

0

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


0

প্রতিশ্রুতি ওভারভিউ:

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

একটি প্রতিশ্রুতিতে সর্বদা 3 টির নিম্নলিখিতটি থাকে:

  1. মুলতুবি: প্রতিটি প্রতিশ্রুতি শুরুর অবস্থা, না পূরণ বা প্রত্যাখ্যান।
  2. সম্পন্ন: অপারেশনটি সফলভাবে শেষ হয়েছে।
  3. প্রত্যাখ্যান: অপারেশন ব্যর্থ হয়েছে।

একটি মুলতুবি প্রতিশ্রুতি সমাধান করা / পূর্ণ পূরণ বা মান সহ প্রত্যাখ্যান করা যেতে পারে। তারপরে নিম্নলিখিত হ্যান্ডলার পদ্ধতিগুলি যা কলব্যাকগুলি আর্গুমেন্ট হিসাবে গ্রহণ করে:

  1. Promise.prototype.then() : প্রতিশ্রুতি সমাধান হলে এই ফাংশনের কলব্যাক আর্গুমেন্ট কল করা হবে।
  2. Promise.prototype.catch() : প্রতিশ্রুতি প্রত্যাখাত হলে এই ফাংশনের কলব্যাক আর্গুমেন্ট বলা হবে।

যদিও উপরের পদ্ধতিগুলি দক্ষতা কলব্যাক আর্গুমেন্টগুলি পেয়েছে তারা কেবলমাত্র কলব্যাকগুলি ব্যবহার করার চেয়ে এখানে অনেক বেশি উন্নত an এটি একটি উদাহরণ যা অনেক স্পষ্ট করে দেবে:

উদাহরণ

function createProm(resolveVal, rejectVal) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (Math.random() > 0.5) {
                console.log("Resolved");
                resolve(resolveVal);
            } else {
                console.log("Rejected");
                reject(rejectVal);
            }
        }, 1000);
    });
}

createProm(1, 2)
    .then((resVal) => {
        console.log(resVal);
        return resVal + 1;
    })
    .then((resVal) => {
        console.log(resVal);
        return resVal + 2;
    })
    .catch((rejectVal) => {
        console.log(rejectVal);
        return rejectVal + 1;
    })
    .then((resVal) => {
        console.log(resVal);
    })
    .finally(() => {
        console.log("Promise done");
    });

  • ক্রিয়েটপ্রোম ফাংশন এমন প্রতিশ্রুতি তৈরি করে যা 1 সেকেন্ডের পরে এলোমেলো এনআর এর ভিত্তিতে সমাধান বা বাতিল হয়ে যায়
  • যদি প্রতিশ্রুতিটি সমাধান হয় তবে প্রথম thenপদ্ধতিটি কল করা হবে এবং কলব্যাকের আর্গুমেন্ট হিসাবে সমাধান হওয়া মানটি পাস করা হবে
  • প্রতিশ্রুতি প্রত্যাখাত হলে প্রথম catchপদ্ধতিটি বলা হয় এবং প্রত্যাখ্যাত মানটি একটি আর্গুমেন্ট হিসাবে পাস করা হয়
  • catchএবং thenপদ্ধতি ফিরে প্রতিশ্রুতি কেন যে আমরা তাদের চেইন পারবেন না। এগুলিতে তারা কোনও ফেরত মান Promise.resolveএবং কোনও নিক্ষিপ্ত মান ( throwকীওয়ার্ড ব্যবহার করে ) গুটিয়ে রাখে Promise.reject। সুতরাং যে কোনও মান ফেরত দেওয়া প্রতিশ্রুতিতে রূপান্তরিত হয় এবং এই প্রতিশ্রুতিতে আমরা আবার একটি হ্যান্ডলার ফাংশন কল করতে পারি।
  • প্রতিশ্রুতিবদ্ধ চেইনগুলি নেস্টেড কলব্যাকের চেয়ে আরও সূক্ষ্ম সুরক্ষা নিয়ন্ত্রণ এবং আরও ভাল ওভারভিউ দেয়। উদাহরণস্বরূপ catchপদ্ধতিটি হ্যান্ডলারের আগে উপস্থিত সমস্ত ত্রুটিগুলি catchপরিচালনা করে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.