কল হ্যাক মানে হ'ল আপনি অন্য কলব্যাকের অভ্যন্তরে কলব্যাকের অভ্যন্তরে রয়েছেন এবং আপনার প্রয়োজনীয়তা পূরণ না হওয়া অবধি এটি কলমে পৌঁছে যাবে।
আসুন নির্ধারিত টাইমআউট এপিআই ব্যবহার করে ভুয়া এজাক্স কলের উদাহরণের মাধ্যমে বুঝতে পারি, ধরা যাক আমাদের একটি রেসিপি এপিআই রয়েছে, আমাদের সমস্ত রেসিপি ডাউনলোড করতে হবে।
<body>
<script>
function getRecipe(){
setTimeout(()=>{
const recipeId = [83938, 73838, 7638];
console.log(recipeId);
}, 1500);
}
getRecipe();
</script>
</body>
উপরের উদাহরণে 1.5 সেকেন্ডের পরে যখন টাইমার কল কল কোডের অভ্যন্তরে শেষ হয় তখন অন্য কথায়, আমাদের জাল এজ্যাক্স কলের মাধ্যমে সমস্ত রেসিপি সার্ভার থেকে ডাউনলোড করা হবে। এখন আমাদের একটি নির্দিষ্ট রেসিপি ডেটা ডাউনলোড করতে হবে।
<body>
<script>
function getRecipe(){
setTimeout(()=>{
const recipeId = [83938, 73838, 7638];
console.log(recipeId);
setTimeout(id=>{
const recipe = {title:'Fresh Apple Juice', publisher:'Suru'};
console.log(`${id}: ${recipe.title}`);
}, 1500, recipeId[2])
}, 1500);
}
getRecipe();
</script>
</body>
একটি নির্দিষ্ট রেসিপি ডেটা ডাউনলোড করতে আমরা আমাদের প্রথম কলব্যাকের ভিতরে কোড লিখেছি এবং রেসিপি আইডিকে পাশ করেছি।
এখন আসুন আমরা আইডি 7638 এর রেসিপিটির একই প্রকাশকের সমস্ত রেসিপিগুলি ডাউনলোড করতে হবে say
<body>
<script>
function getRecipe(){
setTimeout(()=>{
const recipeId = [83938, 73838, 7638];
console.log(recipeId);
setTimeout(id=>{
const recipe = {title:'Fresh Apple Juice', publisher:'Suru'};
console.log(`${id}: ${recipe.title}`);
setTimeout(publisher=>{
const recipe2 = {title:'Fresh Apple Pie', publisher:'Suru'};
console.log(recipe2);
}, 1500, recipe.publisher);
}, 1500, recipeId[2])
}, 1500);
}
getRecipe();
</script>
</body>
আমাদের প্রয়োজনগুলি পূরণ করতে যা প্রকাশক নাম সুরুর সমস্ত রেসিপি ডাউনলোড করতে হয়, আমরা আমাদের দ্বিতীয় কলটির ভিতরে কোড লিখেছিলাম। এটা পরিষ্কার যে আমরা একটি কলব্যাক চেইন লিখেছিলাম যাকে কলব্যাক হেল বলা হয়।
যদি আপনি কলব্যাক জাহান্নাম এড়াতে চান, আপনি প্রতিশ্রুতিটি ব্যবহার করতে পারেন, যা জেএস এস 6 বৈশিষ্ট্য, প্রতিটি প্রতিশ্রুতিতে একটি কলব্যাক লাগে যা কোনও প্রতিশ্রুতি পূর্ণ-পূর্ণ হলে called প্রতিশ্রুতি কলব্যাকের দুটি বিকল্প রয়েছে এটি সমাধান করা বা প্রত্যাখ্যান করা হয়। মনে করুন আপনার এপিআই কলটি সফল হয়েছে আপনি কলটি কল করতে এবং সমাধানের মাধ্যমে ডেটা পাস করতে পারেন, তারপরে () ব্যবহার করে আপনি এই ডেটা পেতে পারেন । তবে যদি আপনার এপিআই ব্যর্থ হয় আপনি প্রত্যাখ্যান করতে পারেন, ত্রুটিটি ধরতে ক্যাচ ব্যবহার করুন । একটি প্রতিশ্রুতি মনে রেখো সবসময় ব্যবহার তারপর মোকাবিলা করতে হবে এবং এর জন্য ধরা জন্য প্রত্যাখ্যান
আসুন আমরা প্রতিশ্রুতি ব্যবহার করে পূর্ববর্তী কলব্যাক হেল্প সমস্যাটি সমাধান করি।
<body>
<script>
const getIds = new Promise((resolve, reject)=>{
setTimeout(()=>{
const downloadSuccessfull = true;
const recipeId = [83938, 73838, 7638];
if(downloadSuccessfull){
resolve(recipeId);
}else{
reject('download failed 404');
}
}, 1500);
});
getIds.then(IDs=>{
console.log(IDs);
}).catch(error=>{
console.log(error);
});
</script>
</body>
এখন নির্দিষ্ট রেসিপিটি ডাউনলোড করুন:
<body>
<script>
const getIds = new Promise((resolve, reject)=>{
setTimeout(()=>{
const downloadSuccessfull = true;
const recipeId = [83938, 73838, 7638];
if(downloadSuccessfull){
resolve(recipeId);
}else{
reject('download failed 404');
}
}, 1500);
});
const getRecipe = recID => {
return new Promise((resolve, reject)=>{
setTimeout(id => {
const downloadSuccessfull = true;
if (downloadSuccessfull){
const recipe = {title:'Fresh Apple Juice', publisher:'Suru'};
resolve(`${id}: ${recipe.title}`);
}else{
reject(`${id}: recipe download failed 404`);
}
}, 1500, recID)
})
}
getIds.then(IDs=>{
console.log(IDs);
return getRecipe(IDs[2]);
}).
then(recipe =>{
console.log(recipe);
})
.catch(error=>{
console.log(error);
});
</script>
</body>
এখন আমরা getRecipe এর মত allRecipeOfAPublisher কল করে আরেকটি পদ্ধতি লিখতে পারি যা প্রতিশ্রুতিও ফিরে আসবে এবং আমরা AllRecipeOfAPublisher এর সমাধানের প্রতিশ্রুতি পাওয়ার জন্য আরও একটি (তখন) লিখতে পারি, আমি আশা করি এই মুহুর্তে আপনি নিজেই এটি করতে পারবেন।
সুতরাং আমরা কীভাবে প্রতিশ্রুতিগুলি তৈরি করা এবং সেবন করতে হবে তা শিখেছি, আসুন এসইএনসি / ওয়েভেট যা এস -8 এ প্রবর্তিত হয় তা ব্যবহার করে একটি প্রতিশ্রুতি গ্রহণ করা সহজ করি।
<body>
<script>
const getIds = new Promise((resolve, reject)=>{
setTimeout(()=>{
const downloadSuccessfull = true;
const recipeId = [83938, 73838, 7638];
if(downloadSuccessfull){
resolve(recipeId);
}else{
reject('download failed 404');
}
}, 1500);
});
const getRecipe = recID => {
return new Promise((resolve, reject)=>{
setTimeout(id => {
const downloadSuccessfull = true;
if (downloadSuccessfull){
const recipe = {title:'Fresh Apple Juice', publisher:'Suru'};
resolve(`${id}: ${recipe.title}`);
}else{
reject(`${id}: recipe download failed 404`);
}
}, 1500, recID)
})
}
async function getRecipesAw(){
const IDs = await getIds;
console.log(IDs);
const recipe = await getRecipe(IDs[2]);
console.log(recipe);
}
getRecipesAw();
</script>
</body>
উপরের উদাহরণে, আমরা একটি অ্যাসিঙ্ক ফাংশন ব্যবহার করেছি কারণ এটি ব্যাকগ্রাউন্ডে চলবে, অ্যাসিঙ্ক ফাংশনের অভ্যন্তরে আমরা প্রতিটি পদ্ধতির আগে কীওয়ার্ডের প্রতীক্ষা করতাম যা প্রত্যাবর্তন করে বা প্রতিশ্রুতি হয় কারণ সেই প্রতিশ্রুতি পূর্ণ না হওয়া পর্যন্ত position অবস্থানে অপেক্ষা করা, অন্য কথায় বেল কোডগুলি সমাধান না হওয়া বা প্রোগ্রাম প্রত্যাখ্যানের পূর্ব পর্যন্ত আইডিগুলি ফিরে আসার পরে কোডটি কার্যকর করা বন্ধ হয়ে যাবে তখন আমরা আবার একটি আইডি দিয়ে getRecipe () ফাংশন বলে থাকি এবং ডেটা ফিরে না আসা পর্যন্ত অপেক্ষা করা কীওয়ার্ড ব্যবহার করে অপেক্ষা করি। সুতরাং অবশেষে আমরা কলব্যাক জাহান্নাম থেকে পুনরুদ্ধার করেছি।
async function getRecipesAw(){
const IDs = await getIds;
console.log(IDs);
const recipe = await getRecipe(IDs[2]);
console.log(recipe);
}
অপেক্ষারত ব্যবহার করতে আমাদের একটি অ্যাসিঙ্ক ফাংশন প্রয়োজন হবে, আমরা কোনও প্রতিশ্রুতি ফিরিয়ে দিতে পারি তাই সমাধান প্রতিশ্রুতির জন্য ব্যবহার করতে পারি এবং প্রতিশ্রুতি প্রত্যাখ্যান করার জন্য ক্যাথ
উপরের উদাহরণ থেকে:
async function getRecipesAw(){
const IDs = await getIds;
const recipe = await getRecipe(IDs[2]);
return recipe;
}
getRecipesAw().then(result=>{
console.log(result);
}).catch(error=>{
console.log(error);
});