জাভাস্ক্রিপ্টে স্থগিত, প্রতিশ্রুতি এবং ভবিষ্যতের মধ্যে পার্থক্যগুলি কী কী?


300

ডিফার্ড, প্রতিশ্রুতি এবং ফিউচারের মধ্যে পার্থক্য কী?
এই তিনটির পিছনে কি কোনও অনুমোদিত তত্ত্ব আছে?


11
আমি jQuery এর সাথে কিছু করার আছে বলে আমি মনে করি না ...
বোল্টক্লক

11
এটি পড়ার পক্ষে মূল্যবান: এমএসডিএন.মাইক্রোসফটকম
en

8
আমি সেগুলি নিজেরাই ব্যবহার করি নি তবে এখানে উইকিপিডিয়া এন.ইউইকিপিডিয়া . org / উইকি / ফিউচার_অ্যান্ড_প্রোমিজায় বেশ ভাল পরিচয় । যদিও আমি ব্যবহারের কেসটি সঠিকভাবে বুঝতে পারি না। একটি অ্যাসিঙ্ক ইভেন্টে জাভাস্ক্রিপ্টের মতো চালিত ভাষা। প্রথম নজরে আমি দেখতে পাচ্ছি না তারা কলব্যাকের চেয়ে কী প্রস্তাব দেয়, সম্ভবত কোনও ক্লিনার এপিআই। আমি এটি পছন্দ করব যদি কেউ উদাহরণ ব্যবহারের ক্ষেত্রে কেস সরবরাহ করতে পারে এবং এই ধারণাগুলি কীভাবে প্রয়োগ করা হয় এবং কেন কলব্যাকগুলি একটি অকার্যকর সমাধান হতে পারে তা দেখায়। @ ডুরি এর jQuery এর সাথে কোনও সম্পর্ক নেই। JQuery ট্যাগটি সরানো যেতে পারে দয়া করে
অ্যাশ হেস্কস

2
@ jfriend00 দুর্দান্ত লিঙ্ক, সম্ভবত একটি উত্তর মধ্যে কাজ করা উচিত।
fncomp

@ jfriend00 নতুন লিঙ্ক - msdn.microsoft.com/en-us/magazine/gg723713.aspx
c69

উত্তর:


97

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

আপনি যদি মিনিটটিতে আগ্রহী হন, তবে প্রতিশ্রুতি / এ + পরীক্ষা করুন ।


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

ফাংশনগুলিতে সরাসরি কলব্যাকগুলি পাস করার পরিবর্তে, এমন কিছু যা প্রতিশ্রুতি ব্যবহার করে দৃly়ভাবে সংযুক্ত ইন্টারফেসের দিকে পরিচালিত করতে পারে সে কোডের জন্য উদ্বেগগুলি পৃথক করতে দেয় যা সিঙ্ক্রোনাস বা অ্যাসিঙ্ক্রোনাস।

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

প্রকৃতপক্ষে, জেএস মোডে কোডমিরার লোড করার পরে কিছু করার খাঁটি কলব্যাক ফর্মটি তুলনা করুন সংক্ষেপে (দুঃখিত, আমি কিছুক্ষণের জন্য jQuery ব্যবহার করিনি ):

/* assume getScript has signature like: function (path, callback, context) 
   and listens to onload && onreadystatechange */
$(function () {
   getScript('path/to/CodeMirror', getJSMode);

   // onreadystate is not reliable for callback args.
   function getJSMode() {
       getScript('path/to/CodeMirror/mode/javascript/javascript.js', 
           ourAwesomeScript);
   };

   function ourAwesomeScript() {
       console.log("CodeMirror is awesome, but I'm too impatient.");
   };
});

প্রতিশ্রুতি রচনা সংস্করণে (আবারও, ক্ষমাপ্রার্থী, আমি jQuery এ আপ টু ডেট নেই):

/* Assume getScript returns a promise object */
$(function () {
   $.when(
       getScript('path/to/CodeMirror'),
       getScript('path/to/CodeMirror/mode/javascript/javascript.js')
   ).then(function () {
       console.log("CodeMirror is awesome, but I'm too impatient.");
   });
});

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


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

@ মার্টিনকেলম্যান আপনি ঠিক বলেছেন! আমি কিছুক্ষণের মধ্যে এটি পুনর্বিবেচনা করি নি এবং কিছুটা শিখেছি আমি নীচে একটি পৃথক উত্তর পোস্ট করব, তবে এটিকে ছেড়ে দিন যেহেতু লোকেরা ব্যবহারের উদাহরণ থেকে উপকৃত হয়েছে।
fncomp

@ মার্টিনকেলম্যান, একটি নতুন উত্তর লেখার বিষয়টি বিবেচনা করেছেন। তবে আমি মনে করি ওপি আসলে প্রতিশ্রুতি এবং ডিফার্ডগুলির জন্য কী তা জানতে চেয়েছিল। তার আসল প্রশ্নের উত্তর হবে, মোটামুটি, "পিছিয়ে দেওয়া তাদের আত্ম-সমাধান করতে পারে। আফাইক, প্রতিশ্রুতি এবং পিছিয়ে দেওয়ার পিছনে তত্ত্বটি আসে [ফাংশনাল রিঅ্যাকটিভ প্রোগ্রামিং | হাস্কেল.আর / হ্যাশেলউইকি / ফাংশনাল_রিঅ্যাকটিভ_প্রগ্রামিং] , যা কলব্যাকগুলি সমতল করার কৌশল technique । "
fncomp

2
এটি কেবল সম্পূর্ণ ভুল এবং আপনার উদাহরণগুলি কলব্যাকগুলির সাথে করা ঠিক তত সহজ। প্রতিশ্রুতি কলব্যাক একীকরণ এবং ডিকোপলিং সম্পর্কে নয় তবে সিঙ্ক কোডের মতো অ্যাসিঙ্ক কোড লিখতে একটি ডিএসএল সরবরাহ করা। বিশেষত এর fn(callback, errback)চেয়ে শক্তভাবে মিলিত বা কম কার্যকর fn().then(callback, errback)নয় - তবে যেভাবেই প্রতিশ্রুতি ব্যবহার করা এটি একটি ভুল উপায়। আমি বিশেষত কার্গো কাল্ট $.whenউদাহরণটিকে ঘৃণা করি - $.whenকলব্যাকের সাথে কাজ করে এমন কোনও ফাংশন আপনার থাকতে পারে না এমন কোনও কারণ নেই ।
ইসাইলিজা

এটি +1 সত্ত্বেও প্রশ্নের উত্তর দেয় না যে আমি কলব্যাক হেল কী তা জানতে সক্ষম হতে পারি।
ভোজেন্দ্র রুনিয়র

146

নির্বাচিত উত্তর সহ এই উত্তর, ধারণার দিক থেকে প্রতিশ্রুতি উপস্থাপক কিন্তু সুনির্দিষ্ট উদাসীন ঠিক পার্থক্য পরিভাষা যে যখন তাদের বাস্তবায়ন (এবং সেখানে লাইব্রেরি ব্যবহার দেখা দেয় দুটো কারণে হয় জন্য ভাল হয় গুরুত্বপূর্ণ পার্থক্য)।

যেহেতু এটি এখনও একটি বিবর্তিত অনুমান , তাই উত্তরটি বর্তমানে উইকিপিডিয়া (যেমন উইকিপিডিয়া ) এবং বাস্তবায়ন ( jQuery এর মতো) উভয় জরিপ করার চেষ্টা থেকে আসে :

  • বিলম্বিত : জনপ্রিয় রেফারেন্স বর্ণিত কখনও, 1 2 3 4 প্রতিশ্রুতি রেজোলিউশন (বাস্তবায়নের সালিশ হিসেবে নয় বরং সাধারণভাবে ব্যবহৃত বাস্তবায়নের দ্বারা এবং )। 5 6 7 resolvereject

    কখনও কখনও স্থগিতগুলি প্রতিশ্রুতিও দেওয়া হয় (বাস্তবায়ন করা হয় then), 5 6 6 বার এটি আরও বিশুদ্ধ হিসাবে দেখা যায় যে ডিফারড কেবলমাত্র রেজোলিউশনে সক্ষম হয় এবং ব্যবহারকারীর ব্যবহারের প্রতিশ্রুতি অ্যাক্সেস করতে বাধ্য করে । 7 then

  • প্রতিশ্রুতি : আলোচনার অধীনে কৌশলের জন্য সর্বাধিক অন্তর্ভুক্ত শব্দ।

    একটি প্রক্সি অবজেক্ট কোনও টার্গেট ফাংশনের ফলাফল সংরক্ষণ করে যার সমকালীনতাটিকে আমরা বিমূর্ত করতে চাই এবং আরও একটি thenলক্ষ্য ফাংশন গ্রহণ করে একটি ফাংশন প্রকাশ করে এবং একটি নতুন প্রতিশ্রুতি ফিরিয়ে দেয়। 2

    সাধারণ জেএস থেকে উদাহরণ :

    > asyncComputeTheAnswerToEverything()
        .then(addTwo)
        .then(printResult);
    44

     

    সর্বদা জনপ্রিয় রেফারেন্সে বর্ণিত, যদিও এর দায়বদ্ধতার রেজোলিউশনটি কখনই আসে তার বিষয়ে নির্দিষ্ট করে দেওয়া হয়নি। 1 2 3 4

    সর্বদা জনপ্রিয় বাস্তবায়নে উপস্থিত থাকে এবং কখনও রেজোলিউশন দেয় না। 5 6 7

  • ভবিষ্যত : কিছু জনপ্রিয় রেফারেন্স 1 এবং কমপক্ষে একটি জনপ্রিয় বাস্তবায়নের মধ্যে একটি আপাতদৃষ্টিতে অবমূল্যায়িত শব্দটি পাওয়া গেছে , 8 তবে 'প্রতিশ্রুতি' 3 শব্দটির পক্ষে অগ্রাধিকার হিসাবে আলোচনার মধ্য দিয়ে পর্যায়ক্রমে আলোচনা করা হচ্ছে এবং বিষয়টির জনপ্রিয় পরিচিতিতে সর্বদা উল্লেখ করা হয়নি mentioned 9

    তবে কমপক্ষে একটি লাইব্রেরি সিঙ্ক্রোনসিটি এবং ত্রুটি পরিচালনার জন্য বিমূর্তভাবে শব্দটি ব্যবহার করে, thenকার্যকারিতা সরবরাহ না করে not 10 'প্রতিশ্রুতি' শব্দটি এড়ানো উদ্দেশ্যমূলক ছিল কিনা তা স্পষ্ট নয়, তবে আশেপাশে প্রতিশ্রুতি নির্মিত হওয়ার পরে সম্ভবত একটি ভাল পছন্দ 'তাত্পর্যযোগ্য'। 2

তথ্যসূত্র

  1. প্রতিশ্রুতি ও ফিউচারে উইকিপিডিয়া
  2. প্রতিশ্রুতি / এ + বিশেষ
  3. প্রতিশ্রুতি উপর ডোম স্ট্যান্ডার্ড
  4. ডোম স্ট্যান্ডার্ড প্রতিজ্ঞা WIP
  5. ডিওজেও সরঞ্জামকিট স্থগিত
  6. jQuery ডিফার্ডস
  7. প্রশ্নঃ
  8. FutureJS
  9. প্রতিশ্রুতি সম্পর্কিত কার্যকরী জাভাস্ক্রিপ্ট বিভাগ
  10. অ্যাংুলারজেএস ইন্টিগ্রেশন টেস্টে ফিউচারস

সম্ভাব্য বিভ্রান্তিকর জিনিসগুলি


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

1
এবং অবশ্যই মাইক্রোসফ্টকে এর জন্য তাদের নিজস্ব শব্দটি নিয়ে আসতে হয়েছিল, তাই সি # তে তাদের ডাকা হয়Task
ব্লুরাজা - ড্যানি প্লেফুঘুফুট

72

আমার পক্ষে সত্যই এটি কীভাবে ক্লিক করেছে তা হ'ল ডোমেনিক ডেনিকোলা এই উপস্থাপনা

একটি GitHub সারকথা , তিনি দিলেন সবচেয়ে ভালো বর্ণনা আমি, এটা খুবই সংক্ষিপ্ত আছে:

প্রতিশ্রুতির বিষয়টি হ'ল আমাদেরকে অ্যাসিঙ্ক বিশ্বে কার্যকরী রচনা এবং ত্রুটি বুদবুদ ফিরে দেওয়া।

অন্য কথায়, প্রতিশ্রুতিগুলি এমন একটি উপায় যা আমাদের অ্যাসিনক্রোনাস কোড লিখতে দেয় যা প্রায় সমানভাবে লিখতে হয় যেমন এটি সিঙ্ক্রোনাস

প্রতিশ্রুতি সহ এই উদাহরণটি বিবেচনা করুন:

getTweetsFor("domenic") // promise-returning async function
    .then(function (tweets) {
        var shortUrls = parseTweetsForUrls(tweets);
        var mostRecentShortUrl = shortUrls[0];
        return expandUrlUsingTwitterApi(mostRecentShortUrl); // promise-returning async function
    })
    .then(doHttpRequest) // promise-returning async function
    .then(
        function (responseBody) {
            console.log("Most recent link text:", responseBody);
        },
        function (error) {
            console.error("Error with the twitterverse:", error);
        }
    );

এটি এমনভাবে কাজ করে যে আপনি এই সিঙ্ক্রোনাস কোডটি লিখেছেন:

try {
    var tweets = getTweetsFor("domenic"); // blocking
    var shortUrls = parseTweetsForUrls(tweets);
    var mostRecentShortUrl = shortUrls[0];
    var responseBody = doHttpRequest(expandUrlUsingTwitterApi(mostRecentShortUrl)); // blocking x 2
    console.log("Most recent link text:", responseBody);
} catch (error) {
    console.error("Error with the twitterverse: ", error);
}

(এটি যদি এখনও জটিল মনে হয় তবে উপস্থাপনাটি দেখুন!)

স্থগিত সম্পর্কিত, এটি উপায় .resolve()বা .reject()প্রতিশ্রুতি। ইন অঙ্গীকার / বি বৈশিষ্ট, এটা বলা হয় .defer()। JQuery এ, এটি $.Deferred()

দয়া করে নোট করুন, যতদূর আমি জানি, jQuery এর প্রতিশ্রুতি বাস্তবায়ন নষ্ট হয়েছে (কমেন্ট দেখুন), কমপক্ষে jQuery 1.8.2 হিসাবে।
এটি অনুমান করা হয় প্রতিশ্রুতি / A এর পরে সক্ষম করে তবে আপনি "তত্ক্ষণাত চেষ্টা / ধরা" কার্যকারিতাটি কাজ করবে না এমন অর্থে আপনার সঠিক ত্রুটিটি পরিচালনা করতে হবে না। কোনটি দুঃখের বিষয়, কারণ অ্যাসিঙ্ক কোড সহ "চেষ্টা / ধরা" থাকা সম্পূর্ণ দুর্দান্ত cool

আপনি যদি প্রতিশ্রুতি ব্যবহার করতে চলেছেন (আপনার নিজের কোড দিয়ে এগুলি ব্যবহার করে দেখানো উচিত!), ক্রিস কোওয়ালের কিউ ব্যবহার করুন । JQuery সংস্করণটি ক্লিনার jQuery কোড লেখার জন্য কেবল কিছু কলব্যাক এগ্রিগেটর তবে পয়েন্টটি মিস করে।

ফিউচার সম্পর্কিত, আমার কোনও ধারণা নেই, আমি কোনও এপিআইতে দেখিনি।

সম্পাদনা করুন: নীচে @ ফার্মের মন্তব্য থেকে প্রতিশ্রুতি সম্পর্কে ডোমেনিক ডেনিকোলার ইউটিউব আলাপ

ভিডিও থেকে মাইকেল জ্যাকসনের একটি উদ্ধৃতি (হ্যাঁ, মাইকেল জ্যাকসন ):

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

এটি একটি দুর্দান্ত বিবরণ: একটি প্রতিশ্রুতি ভবিষ্যতের পরিবর্তনের মতো - কোনও কোনও ক্ষেত্রে প্রথম শ্রেণির রেফারেন্স যা কোনও কোনও সময়ে উপস্থিত থাকে (বা ঘটবে)।


5
: W3 এবং Chrome কোর দলের সদস্য দ্বারা ফিউচার (! এখন DOM মধ্যে বাস্তবায়িত) একটি মহান ব্যাখ্যা এখানে পাওয়া যাবে xanthir.com/b4PY0
oligofren থেকে

1
@ লিগোফ্রেন এই লিঙ্কটির জন্য ধন্যবাদ, এটি দুর্দান্ত বলে মনে হচ্ছে! যাইহোক, কী রহস্যজনকভাবে বিরক্তিকর ফ্যাভিকন লল।
ক্যামিলো মার্টিন

1
এই উত্তরটির জন্য আরও অনেকগুলি মূল্যায়ন প্রয়োজন। এটি গ্রহণযোগ্য উত্তর আইএমওর চেয়ে বেশি ভোট দেওয়া উচিত।
শেভ

1
প্রতিশ্রুতিতে ডোমেনিক ডেনিকোলার ইউটিউব আলাপ: youtube.com/watch?v=hf1T_AONQJU
ফার্ম

@ ফারম গ্রেট! আমি এটি উত্তরে যুক্ত করব।
ক্যামিলো মার্টিন

32

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

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

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

যদি লক্ষ্য সরবরাহ করা হয়, deferred.promise()তবে এর সাথে পদ্ধতিগুলি সংযুক্ত করে তারপরে একটি নতুন তৈরি করার পরিবর্তে এই বস্তুটি ফিরিয়ে দেবে। ইতিমধ্যে বিদ্যমান একটি বস্তুর সাথে প্রতিশ্রুতিমূলক আচরণ সংযুক্ত করতে এটি কার্যকর হতে পারে।

যদি আপনি একটি স্থগিত তৈরি করে থাকেন তবে মুলতুবিতে একটি রেফারেন্স রাখুন যাতে এটি কোনও সময়ে সমাধান বা বাতিল হতে পারে। ডিফার্ড.প্রোমাইজ () এর মাধ্যমে কেবল প্রতিশ্রুতি বস্তুটি ফেরত দিন যাতে অন্য কোড কলব্যাকগুলি নিবন্ধন করতে পারে বা বর্তমান অবস্থাটি পরীক্ষা করতে পারে।

কেবলমাত্র আমরা বলতে পারি যে একটি প্রতিশ্রুতি এমন একটি মান উপস্থাপন করে যা এখনও অবধি জানা যায়নি যেখানে একটি ডিফার্ড হিসাবে এখনও কাজ শেষ হয় না যা এখনও শেষ হয়নি।


এখানে চিত্র বর্ণনা লিখুন


1
চার্ট উপস্থাপনের জন্য প্লাস 1। Bravisimo !! ^ _ ^
অশোক এম এ

23
  • promiseএমন একটি মান উপস্থাপন করে যা এখনও জানা যায় নি
  • একটি deferredএমন কাজ প্রতিনিধিত্ব করে যা এখনও শেষ হয়নি

একটি প্রতিশ্রুতি একটি ফলাফলের জন্য স্থানধারক যা প্রাথমিকভাবে অজানা যখন একটি পিছিয়ে দেওয়া সেই গণনার প্রতিনিধিত্ব করে যা মানটির ফলাফল দেয়।

উল্লেখ

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