উত্তর:
জাভাস্ক্রিপ্টে অ্যাসিক্রোনাস কলগুলি মোকাবেলা করার traditionalতিহ্যগত উপায়টি কলব্যাক সহ। বলুন আমাদের অ্যাপ্লিকেশন সেট আপ করতে আমাদের একের পর এক সার্ভারে তিনটি কল করতে হয়েছিল। কলব্যাক সহ, কোডটি নীচের মতো দেখতে পারে (সার্ভার কল করার জন্য একটি এক্সএইচআরজিইটি ফাংশন ধরে):
// Fetch some server configuration
xhrGET('/api/server-config', function(config) {
// Fetch the user information, if he's logged in
xhrGET('/api/' + config.USER_END_POINT, function(user) {
// Fetch the items for the user
xhrGET('/api/' + user.id + '/items', function(items) {
// Actually display the items here
});
});
});
এই উদাহরণে, আমরা প্রথমে সার্ভার কনফিগারেশনটি আনি। তারপরে এর ভিত্তিতে আমরা বর্তমান ব্যবহারকারীর সম্পর্কে তথ্য আনি এবং তারপরে অবশেষে বর্তমান ব্যবহারকারীর আইটেমের তালিকাটি পাই। প্রতিটি এক্সএইচআরজিইটি কল একটি কলব্যাক ফাংশন নেয় যা সার্ভারের প্রতিক্রিয়া জানালে কার্যকর করা হয়।
এখন অবশ্যই আমাদের আরও স্তরের নেস্টিংয়ের স্তর রয়েছে, কোডটি পড়া, ডিবাগ, রক্ষণাবেক্ষণ, আপগ্রেড এবং মূলত এর সাথে কাজ করা আরও কঠিন। এটি সাধারণত কলব্যাক হেলক হিসাবে পরিচিত। এছাড়াও, যদি আমাদের ত্রুটিগুলি পরিচালনা করতে হয়, তবে ত্রুটির ক্ষেত্রে আমাদের কী করা দরকার তা জানাতে আমাদের প্রতিটি এক্সএইচআরজিইটি কলটিতে সম্ভবত অন্য একটি ফাংশনটি পাস করতে হবে। যদি আমরা কেবল একটি সাধারণ ত্রুটি হ্যান্ডলার রাখতে চাই, তবে এটি সম্ভব নয়।
প্রতিশ্রুতি API এ বাসা বাঁধার সমস্যা এবং ত্রুটি পরিচালনার সমস্যা সমাধানের জন্য ডিজাইন করা হয়েছিল।
প্রতিশ্রুতি এপিআই নিম্নলিখিত প্রস্তাব করে:
promiseঅবজেক্ট ফিরিয়ে দেবে ।promiseবস্তুর একটি thenফাংশন থাকবে যা দুটি আর্গুমেন্ট নিতে পারে, একটি success
হ্যান্ডলার এবং একটি errorহ্যান্ডলার।thenকেবল একবার কল করা হবে ।thenফাংশন একটি ফিরে আসবে promise, একাধিক কল chaining অনুমতি দেয়।valueপারে, যা পরের ফাংশনে একটি হিসাবে দেওয়া হবে argument, এর শৃঙ্খলে promise।promise(অন্য একটি অ্যাসিনক্রোনাস অনুরোধ করে), তবে পরবর্তী অনুরোধকারী (সাফল্য বা ত্রুটি) কেবলমাত্র সেই অনুরোধটি শেষ হওয়ার পরে কল করা হবে।সুতরাং পূর্ববর্তী উদাহরণ কোডটি নীচের মতো কিছুতে প্রতিশ্রুতি এবং $httpপরিষেবা (AngularJs) ব্যবহার করে অনুবাদ করতে পারে :
$http.get('/api/server-config').then(
function(configResponse) {
return $http.get('/api/' + configResponse.data.USER_END_POINT);
}
).then(
function(userResponse) {
return $http.get('/api/' + userResponse.data.id + '/items');
}
).then(
function(itemResponse) {
// Display items here
},
function(error) {
// Common error handling
}
);
সাফল্য এবং ত্রুটি প্রচার করা
প্রতিশ্রুতিবদ্ধ শৃঙ্খলা একটি অত্যন্ত শক্তিশালী কৌশল যা আমাদের প্রচুর কার্যকারিতা সম্পাদন করতে দেয়, যেমন কোনও সার্ভিস কল করা, ডেটা পোস্ট পোস্টের প্রসেসিং করা এবং তারপরে প্রক্রিয়াজাত ডেটা নিয়ন্ত্রণকারীকে ফিরিয়ে দেওয়া। তবে যখন আমরা promiseচেইনগুলি নিয়ে কাজ করি তখন
কয়েকটি বিষয় আমাদের মনে রাখা উচিত।
promiseপি 1, পি 2 এবং পি 3 তিনটি প্রতিশ্রুতি সহ নিম্নলিখিত অনুমানের শৃঙ্খলা বিবেচনা করুন । প্রত্যেকের promiseএকটি সাফল্য হ্যান্ডলার এবং একটি ত্রুটি হ্যান্ডলার রয়েছে, সুতরাং পি 1 এর জন্য এস 1 এবং ই 1, পি 2 এর জন্য এস 2 এবং ই 2, এবং পি 3 এর জন্য এস 3 এবং ই 3:
xhrCall()
.then(S1, E1) //P1
.then(S2, E2) //P2
.then(S3, E3) //P3
জিনিসগুলির স্বাভাবিক প্রবাহে, যেখানে কোনও ত্রুটি নেই, অ্যাপ্লিকেশনটি এস 1, এস 2 এবং শেষ পর্যন্ত এস 3 এর মাধ্যমে প্রবাহিত হবে। কিন্তু বাস্তব জীবনে জিনিসগুলি কখনই তেমন মসৃণ হয় না। P1 একটি ত্রুটির মুখোমুখি হতে পারে বা P2 E1 বা E2 ট্রিগার করে একটি ত্রুটির সম্মুখীন হতে পারে।
নিম্নলিখিত বিষয়গুলি বিবেচনা করুন:
P আমরা P1 তে সার্ভারের একটি সফল প্রতিক্রিয়া পেয়েছি, তবে ফিরিয়ে দেওয়া ডেটা সঠিক নয়, বা সার্ভারে কোনও ডেটা উপলব্ধ নেই (খালি অ্যারে ভাবেন)। এই জাতীয় ক্ষেত্রে, পরবর্তী প্রতিশ্রুতি P2 এর জন্য, এটি ত্রুটি হ্যান্ডলার E2 ট্রিগার করতে হবে।
Promise আমরা প্রতিশ্রুতি P2 এর জন্য একটি ত্রুটি পেয়েছি, E2 ট্রিগার করে। তবে হ্যান্ডলারের ভিতরে, আমাদের কাছে ক্যাশে থেকে ডেটা রয়েছে, এটি নিশ্চিত করে যে অ্যাপ্লিকেশনটি স্বাভাবিক হিসাবে লোড করতে পারে। সেক্ষেত্রে আমরা এটি নিশ্চিত করতে চাই যে E2, S3 পরে কল করা হবে।
সুতরাং প্রতিবার আমরা যখন কোনও সাফল্য বা ত্রুটি হ্যান্ডলার লিখি তখন আমাদের একটি কল করা দরকার our আমাদের বর্তমান ফাংশনটি বিবেচনা করে, প্রতিশ্রুতিটি কি সাফল্য বা প্রতিশ্রুতি শৃঙ্খলে পরবর্তী হ্যান্ডলারের জন্য ব্যর্থতা?
যদি আমরা শৃঙ্খলে পরবর্তী প্রতিশ্রুতির জন্য সাফল্য হ্যান্ডলারটি ট্রিগার করতে চাই, আমরা কেবল সাফল্য বা ত্রুটি হ্যান্ডলার থেকে কোনও মান ফিরিয়ে দিতে পারি
অন্যদিকে, যদি আমরা শৃঙ্খলে পরবর্তী প্রতিশ্রুতিটির জন্য ত্রুটি হ্যান্ডলারটি ট্রিগার করতে চাই, আমরা এটি কোনও deferredবস্তু ব্যবহার করে এবং এর reject()পদ্ধতিটি কল করতে পারি
এখন পিছিয়ে অবজেক্ট কি?
জিকিউরিয়ায় স্থগিত করা অবজেক্টগুলি এমন একক কাজের প্রতিনিধিত্ব করে যা পরে শেষ হয়ে যায়, সাধারণত অ্যাসিনক্রোনাক্যালি। কাজের ইউনিটটি সম্পূর্ণ হয়ে গেলে,
deferredঅবজেক্টটি সমাধান করা যায় বা ব্যর্থ হয়।কোন
deferredবস্তুতে একটি বস্তু থাকেpromise।promiseকাজের ইউনিটটি সম্পূর্ণ হওয়ার পরে কী ঘটবে তা আপনি নির্দিষ্ট করতে পারেন এমন বস্তুর মাধ্যমে । আপনিpromiseঅবজেক্টে কলব্যাক ফাংশন সেট করে এটি করেন ।
জ্যাকুরিতে স্থগিত করা বস্তু: https://api.jquery.com/jquery.deferred/
কৌণিক জেগুলিতে স্থগিত করা বস্তু: https://docs.angularjs.org/api/ng/service/ $ q
তারপরে () ফাংশনটি "জাভাস্ক্রিপ্ট প্রতিশ্রুতি" সম্পর্কিত যা কিছু লাইব্রেরি বা ফ্রেমওয়ার্কগুলিতে যেমন jQuery বা AngularJS ব্যবহার করা হয়।
প্রতিশ্রুতি হ'ল অ্যাসিনক্রোনাস অপারেশন পরিচালনা করার জন্য একটি নিদর্শন। প্রতিশ্রুতি আপনাকে "তারপর" নামক কোনও পদ্ধতিতে কল করার অনুমতি দেয় যা আপনাকে কলব্যাক হিসাবে ব্যবহার করতে ফাংশন (গুলি) নির্দিষ্ট করতে দেয়।
আরও তথ্যের জন্য দেখুন: http://wildermuth.com/2013/8/3/ জাভা স্ক্রিপ্ট_প্রোমাইজ করুন
এবং কৌনিক প্রতিশ্রুতির জন্য: http://liamkaufman.com/blog/2013/09/09/using-angularjs-promises/
A promise can only succeed or fail once, এবংIf a promise has succeeded or failed and you later add a success/failure callback, the correct callback will be called
আমার জানা মতে, (এই লেখার সময়) কোনও অন্তর্নির্মিত then()পদ্ধতি নেই javascript।
দেখা যাচ্ছে এটি যেই doSome("task")ফিরে আসবে তার একটি পদ্ধতি আছে then।
আপনি যদি doSome()কনসোলে রিটার্নের ফলাফলটি লগইন করেন তবে কী ফিরিয়ে দেওয়া হয়েছে তার বৈশিষ্ট্যগুলি আপনাকে দেখতে পারা উচিত।
console.log( myObj.doSome("task") ); // Expand the returned object in the
// console to see its properties.
আপডেট (ECMAScript6 হিসাবে) : -
.then()ফাংশন বিশুদ্ধ জাভাস্ক্রিপ্ট অন্তর্ভুক্ত করা হয়েছে।
এখানে মজিলা ডকুমেন্টেশন থেকে ,
ততকালীন () পদ্ধতিটি প্রতিশ্রুতি দেয় returns এটি দুটি যুক্তি গ্রহণ করে: প্রতিশ্রুতি সাফল্য এবং ব্যর্থতার ক্ষেত্রে কলব্যাক ফাংশন।
প্রতিশ্রুতি অবজেক্ট, পরিবর্তে হিসাবে সংজ্ঞায়িত করা হয়
প্রতিশ্রুতি অবজেক্টটি স্থগিত এবং অ্যাসিনক্রোনাস গণনার জন্য ব্যবহৃত হয়। একটি প্রতিশ্রুতি এমন একটি অপারেশন প্রতিনিধিত্ব করে যা এখনও সম্পূর্ণ হয়নি, তবে ভবিষ্যতে প্রত্যাশিত।
এটি হ'ল Promiseএকটি মানের স্থানধারক হিসাবে কাজ করে যা এখনও গণনা করা হয় নি, তবে ভবিষ্যতে সমাধান হবে। এবং .then()ফাংশনটি যখন সমাধান হয়ে যায় তখন প্রতিশ্রুতি দেওয়ার জন্য ফাংশনগুলি সংযুক্ত করতে ব্যবহৃত হয় - হয় সাফল্য বা ব্যর্থতা হিসাবে।
.then, তবে দেশীয় প্রতিশ্রুতিগুলি এখন ES6 এ আসছে: html5rocks.com/en/tutorials/es6/promises
জিনিসগুলি কীভাবে কাজ করে তা পরিষ্কার করার জন্য আমি এখানে একটি জিনিস তৈরি করেছি। আমার ধারণা অন্যান্যরাও এই নিখুঁত উদাহরণটি দরকারী খুঁজে পেতে পারেন:
doit().then(function() { log('Now finally done!') });
log('---- But notice where this ends up!');
// For pedagogical reasons I originally wrote the following doit()-function so that
// it was clear that it is a promise. That way wasn't really a normal way to do
// it though, and therefore Slikts edited my answer. I therefore now want to remind
// you here that the return value of the following function is a promise, because
// it is an async function (every async function returns a promise).
async function doit() {
log('Calling someTimeConsumingThing');
await someTimeConsumingThing();
log('Ready with someTimeConsumingThing');
}
function someTimeConsumingThing() {
return new Promise(function(resolve,reject) {
setTimeout(resolve, 2000);
})
}
function log(txt) {
document.getElementById('msg').innerHTML += txt + '<br>'
}
<div id='msg'></div>
তারপরে একটি পদ্ধতি কলব্যাক স্ট্যাক যা কোন প্রতিশ্রুতি সমাধানের পরে উপলব্ধ এটি jQuery এর মতো লাইব্রেরির অংশ তবে এখন এটি স্থানীয় জাভাস্ক্রিপ্টে উপলব্ধ এবং নীচে এটি কীভাবে কাজ করে তার বিশদ বিবরণ দেওয়া হল
আপনি নেটিভ জাভাস্ক্রিপ্টে একটি প্রতিশ্রুতি করতে পারেন: যেমন jQuery এর প্রতিশ্রুতি আছে, প্রতিটি প্রতিশ্রুতি স্ট্যাক করা যেতে পারে এবং তারপরে সমাধান ও প্রত্যাখ্যান কলব্যাকের সাহায্যে কল করা যেতে পারে, আপনি এভাবে অ্যাসিঙ্ক্রোনাস কলকে চেইন করতে পারেন।
আমি ব্যাটারি চার্জিং স্থিতিতে এমএসডিএন ডক্স থেকে কাঁটাচামচি সম্পাদনা করেছি ..
এটি যা করে তা ব্যবহারকারীর ল্যাপটপ বা ডিভাইসটি ব্যাটারি চার্জ করছে কিনা তা জানার চেষ্টা করা হচ্ছে। তারপরে বলা হয় এবং আপনি নিজের কাজের পোস্ট সাফল্য করতে পারেন।
navigator
.getBattery()
.then(function(battery) {
var charging = battery.charging;
alert(charging);
})
.then(function(){alert("YeoMan : SINGH is King !!");});
function fetchAsync (url, timeout, onData, onError) {
…
}
let fetchPromised = (url, timeout) => {
return new Promise((resolve, reject) => {
fetchAsync(url, timeout, resolve, reject)
})
}
Promise.all([
fetchPromised("http://backend/foo.txt", 500),
fetchPromised("http://backend/bar.txt", 500),
fetchPromised("http://backend/baz.txt", 500)
]).then((data) => {
let [ foo, bar, baz ] = data
console.log(`success: foo=${foo} bar=${bar} baz=${baz}`)
}, (err) => {
console.log(`error: ${err}`)
})
সংজ্ঞা :: তারপরে অ্যাসিঙ্ক্রোনাস কলব্যাকগুলি সমাধান করার জন্য ব্যবহৃত একটি পদ্ধতি
এটি ES6 এ চালু করা হয়েছে
Es6 প্রতিশ্রুতি এখানে যথাযথ ডকুমেন্টেশন সন্ধান করুন
thenকোথা থেকে আসে এবং কীভাবে এটি কাজ করে তা ব্যাখ্যা না করে কেবলমাত্র API ব্যবহারের একটি উদাহরণ সরবরাহ করে। এই বিবরণ সরবরাহ করার জন্য আপনার নিজের উত্তরটি উন্নত করা উচিত।
আমি সন্দেহ করি যে doSome এটিকে ফিরিয়ে দেয়, যা আমার ওবিজে, এটিতে ততকালীন পদ্ধতিও রয়েছে has স্ট্যান্ডার্ড পদ্ধতি শৃঙ্খলা ...
যদি doSome এটি ফিরিয়ে না নিচ্ছে, ডুসমকে মৃত্যুদন্ড কার্যকর করা হয়েছিল এমন এক বস্তু হ'ল, নিশ্চিত হয়ে নিন যে এটি তত্ক্ষণিক পদ্ধতিতে কোনও বস্তু ফিরিয়ে দিচ্ছে ...
যেমন @ পেট্রিক দেখায়, মানক জেএসের জন্য তখন () নেই
doSome ("কার্য") অবশ্যই একটি প্রতিশ্রুতি বস্তুটি ফিরিয়ে দিবে এবং সেই প্রতিশ্রুতিটি সর্বদা তারপরেই কাজ করে। তাই আপনার কোডটি ঠিক এর মতো
promise.then(function(env) {
// logic
});
এবং আপনি জানেন যে এটি কেবল সদস্য ফাংশন থেকে একটি সাধারণ কল।
.then async ফাংশনে একটি প্রতিশ্রুতি ফেরত দেয়।
ভাল উদাহরণ হবে:
var doSome = new Promise(function(resolve, reject){
resolve('I am doing something');
});
doSome.then(function(value){
console.log(value);
});
এটিতে অন্য যুক্তি যুক্ত করতে, আপনি reject('I am the rejected param')কলটি ফাংশনটি যুক্ত করতে এবং এটি কনসোল.লগও করতে পারেন।
এই ক্ষেত্রে then()বস্তুর দ্বারা ফিরে একটি বর্গ পদ্ধতি doSome()পদ্ধতি।
".পথ ()" ফাংশনটি উইন্ডোজ 8 স্টোর অ্যাপ্লিকেশনগুলির জন্য অ্যাসিঙ্কোরোনাস প্রোগ্রামিংয়ের প্রতিশ্রুতিবদ্ধ বস্তুর জন্য ওয়াইডলে ব্যবহৃত হয়। আমি যতদূর বুঝতে পেরেছি এটি কলব্যাকের মতো কিছুটা কাজ করে।
এই Documentantion ইন বিশদ খুঁজুন http://msdn.microsoft.com/en-us/library/windows/apps/hh700330.aspx
কারণ এটি অন্য কোনও সংজ্ঞায়িত ফাংশনের নামও হতে পারে।
আরেকটি উদাহরণ:
new Promise(function(ok) {
ok(
/* myFunc1(param1, param2, ..) */
)
}).then(function(){
/* myFunc1 succeed */
/* Launch something else */
/* console.log(whateverparam1) */
/* myFunc2(whateverparam1, otherparam, ..) */
}).then(function(){
/* myFunc2 succeed */
/* Launch something else */
/* myFunc3(whatever38, ..) */
})
তীর ফাংশন শর্টহ্যান্ড ব্যবহার করে একই যুক্তি:
new Promise((ok) =>
ok(
/* myFunc1(param1, param2, ..) */
)).then(() =>
/* myFunc1 succeed */
/* Launch something else */
/* Only ONE call or statment can be made inside arrow functions */
/* For example, using console.log here will break everything */
/* myFunc2(whateverparam1, otherparam, ..) */
).then(() =>
/* myFunc2 succeed */
/* Launch something else */
/* Only ONE call or statment can be made inside arrow functions */
/* For example, using console.log here will break everything */
/* myFunc3(whatever38, ..) */
)
আমি প্রায় 8 বছর দেরী, ভাল ... যাইহোক, আসলে (তখন) কী করে তা আমি সত্যিই জানি না তবে এমডিএন এর উত্তর থাকতে পারে। আসলে, আমি আসলে এটি আরও কিছুটা বুঝতে পারি।
এটি আপনাকে প্রয়োজনীয় সমস্ত তথ্য (আশাবাদী) দেখাবে। ইতিমধ্যে যদি কেউ এই লিঙ্কটি পোস্ট না করে। https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then
ফর্ম্যাটটি প্রতিশ্রুতি.প্রোটোটাইপ.থিন () প্রতিশ্রুতি এবং প্রোটোটাইপ একধরণের ভেরিয়েবলের মতো তবে জাভাস্ক্রিপ্টে ভেরিয়েবলের মতো নয়, আমি বলতে চাইছি অন্যান্য জিনিসগুলি সেখানে নেভিগেটর.বাট ব্যাটারি () এর মতো সেখানে যায় then তারপর () যেখানে এটি আসলে বিদ্যমান তবে এটি সবেমাত্র ওয়েবে ব্যবহৃত হয়, এটির মধ্যে ডিভাইসের ব্যাটারি সম্পর্কে স্ট্যাটাসগুলি দেখানো হয়, আপনি যদি আগ্রহী হন তবে এমডিএন-তে আরও তথ্য এবং আরও অনেক কিছু।