প্রতিশ্রুতিগুলি প্রত্যাখ্যান হওয়ার পরে "পরিচালনা করা" যেতে পারে। অর্থাত্, একজন ক্যাচ হ্যান্ডলার সরবরাহ করার আগে কোনও প্রতিশ্রুতি বাতিল হওয়া কলব্যাক কল করতে পারে। এই আচরণটি আমার কাছে কিছুটা বিরক্তিকর কারণ কেউ লিখতে পারে ...
var promise = new Promise(function(resolve) {
kjjdjf(); // this function does not exist });
... এবং এই ক্ষেত্রে, প্রতিশ্রুতি নীরবে প্রত্যাখ্যান করা হয়। যদি কেউ একজন ক্যাচ হ্যান্ডলার যুক্ত করতে ভুলে যায় তবে কোডটি ত্রুটি ছাড়াই নিঃশব্দে চলতে থাকবে। এটি দীর্ঘায়িত এবং হার্ড-টু-বাগ খুঁজে পেতে পারে।
নোড.জেজেসের ক্ষেত্রে, এই নিরবচ্ছিন্ন প্রতিশ্রুতি প্রত্যাখ্যানগুলি পরিচালনা করার এবং সমস্যাগুলির প্রতিবেদন করার কথা রয়েছে। এটি আমাকে ES7 async / অপেক্ষায় নিয়ে আসে। এই উদাহরণ বিবেচনা করুন:
async function getReadyForBed() {
let teethPromise = brushTeeth();
let tempPromise = getRoomTemperature();
// Change clothes based on room temperature
let temp = await tempPromise;
// Assume `changeClothes` also returns a Promise
if(temp > 20) {
await changeClothes("warm");
} else {
await changeClothes("cold");
}
await teethPromise;
}
উপরের উদাহরণে, ধরুন দাঁতপ্রসেস প্রত্যাখ্যান করা হয়েছিল (ত্রুটি: টুথপেস্টের বাইরে!) GetRoomTemperature সম্পন্ন হওয়ার আগে। এই ক্ষেত্রে, দাঁতপ্রোমিজের অপেক্ষা না করা অবধি অবধি বিহীন প্রতিশ্রুতি প্রত্যাখ্যান হবে।
আমার বক্তব্যটি হ'ল ... আমরা যদি অপরিবর্তিত প্রতিশ্রুতি প্রত্যাখ্যানকে একটি সমস্যা হিসাবে বিবেচনা করি তবে প্রতিশ্রুতিগুলি পরে অপেক্ষার মাধ্যমে পরিচালিত হয় তা অজান্তে বাগ হিসাবে প্রকাশিত হতে পারে। আবার আমরা যদি সমস্যাহীন না হয়ে প্রতিশ্রুতিবদ্ধ প্রত্যাখ্যানগুলি বিবেচনা করি তবে বৈধ বাগগুলি প্রতিবেদন নাও পেতে পারে।
এ নিয়ে ভাবনা?
এটি এখানে নোড.জেএস প্রকল্পে আলোচনার সাথে সম্পর্কিত:
ডিফল্ট আনহানডেলড প্রত্যাখ্যান সনাক্তকরণ আচরণ
আপনি যদি কোডটি এভাবে লিখেন:
function getReadyForBed() {
let teethPromise = brushTeeth();
let tempPromise = getRoomTemperature();
// Change clothes based on room temperature
return Promise.resolve(tempPromise)
.then(temp => {
// Assume `changeClothes` also returns a Promise
if (temp > 20) {
return Promise.resolve(changeClothes("warm"));
} else {
return Promise.resolve(changeClothes("cold"));
}
})
.then(teethPromise)
.then(Promise.resolve()); // since the async function returns nothing, ensure it's a resolved promise for `undefined`, unless it's previously rejected
}
যখন getReadyforBed আহ্বান করা হবে, এটি একযোগে চূড়ান্ত (প্রত্যাবর্তিত হয়নি) প্রতিশ্রুতি তৈরি করবে - যা অন্য কোনও প্রতিশ্রুতির মতো একই "হাতছাড়া হওয়া প্রত্যাখ্যান" ত্রুটিযুক্ত থাকবে (অবশ্যই ইঞ্জিনের উপর নির্ভর করে কিছুই হতে পারে না)। (আমি দেখতে পেয়েছি এটি খুব অদ্ভুত আপনার ফাংশন কোনও কিছুই ফেরত না, যার অর্থ আপনার অ্যাসিঙ্ক ফাংশনটি অপরিজ্ঞাতকৃতদের জন্য একটি প্রতিশ্রুতি দেয়।
আমি যদি এখনই কোনও ক্যাচ ছাড়াই কোনও প্রতিশ্রুতি দিয়ে থাকি এবং পরে একটি যোগ করি তবে বেশিরভাগ "অপরিশোধিত প্রত্যাখ্যান ত্রুটি" বাস্তবায়নগুলি পরে যখন আমি এটি পরিচালনা করি তখন সতর্কতাটি প্রত্যাহার করে নেবে। অন্য কথায়, অ্যাসিঙ্ক / অপেক্ষার ফলে আমি যেভাবে দেখতে পারি তাতে কোনও ভাবেই "অপরিবর্তিত প্রত্যাখ্যান" আলোচনার পরিবর্তন করে না।
এই ক্ষতি এড়াতে দয়া করে কোডটি এইভাবে লিখুন:
async function getReadyForBed() {
let teethPromise = brushTeeth();
let tempPromise = getRoomTemperature();
// Change clothes based on room temperature
var clothesPromise = tempPromise.then(function(temp) {
// Assume `changeClothes` also returns a Promise
if(temp > 20) {
return changeClothes("warm");
} else {
return changeClothes("cold");
}
});
/* Note that clothesPromise resolves to the result of `changeClothes`
due to Promise "chaining" magic. */
// Combine promises and await them both
await Promise.all(teethPromise, clothesPromise);
}
মনে রাখবেন যে এটি কোনও অনিচ্ছাকৃত প্রতিশ্রুতি প্রত্যাখ্যান করা উচিত should