প্রতিশ্রুতি দিয়ে, ব্রাউজারগুলি কেন দু'বার প্রত্যাখ্যান করে তবে দু'বার সমাধান না করে?


10

জাভা স্ক্রিপ্ট বুঝতে আমার সমস্যা হচ্ছে promises। আমি নিম্নলিখিত কোডটি লিখেছি:

var p = new Promise(function(resolve,reject){

    reject(Error("hello world"));
});

setTimeout(()=>p.catch(e=>console.log(e)),5000);

আমি তাৎক্ষণিকভাবে এটি আমার ক্রোম বিকাশকারী কনসোলে দেখতে পাচ্ছি: এখানে চিত্র বর্ণনা লিখুন

তবে আমি 5 সেকেন্ড অপেক্ষা করার পরে, বার্তাটি স্বয়ংক্রিয়ভাবে এই চিত্রটির মতো কালো হয়ে যায়: এখানে চিত্র বর্ণনা লিখুন

আমি আমার জাভাস্ক্রিপ্ট কোড এবং বিকাশকারী কনসোলের মধ্যে আগে কখনও এই আচরণটি দেখিনি, যেখানে আমার জাভা স্ক্রিপ্ট কোড বিকাশকারী কনসোলে "বিদ্যমান সামগ্রী পরিবর্তন করতে পারে"।

সুতরাং আমি সিদ্ধান্ত নিয়েছি resolveএই কোডটি লিখে একই পরিস্থিতি ঘটে কিনা :

var p = new Promise(function(resolve,reject){

    resolve("hello world");
});

setTimeout(()=>p.then(e=>console.log(e)),5000);

তবে এই পরিস্থিতিতে, আমার বিকাশকারী কনসোল 5 সেকেন্ড পরে কিছু দেখায় না, যা এটি পরে মুদ্রণ করে hello world

কেন হয় resolveএবং rejectযখন তারা প্রার্থনা করছে পরিপ্রেক্ষিতে তাই ভিন্নভাবে চিকিত্সা?


অতিরিক্ত

আমি এই কোডটিও লিখেছি:

var p = new Promise(function(resolve,reject){

    reject(Error("hello world"));
});

setTimeout(()=>p.catch(e=>console.log("errors",e)),5000);
setTimeout(()=>p.catch(e=>console.log("errors 2",e)),6000);
setTimeout(()=>p.catch(null),7000);

এটি বিকাশকারী কনসোলে বেশ কয়েকটি আউটপুট দেয়। 0 এ সময় লাল ত্রুটি, পাঠ্য সহ 5 সেকেন্ডে লাল রঙে লাল পরিবর্তন হয় errors hello world, তারপরে seconds সেকেন্ডে একটি নতুন ত্রুটি বার্তা errors 2 hello world, তারপরে seconds সেকেন্ডে একটি লাল ত্রুটি বার্তা। rejectপ্রকৃতপক্ষে কতবার আহ্বান করা হয়েছে তা নিয়ে আমি এখন খুব বিভ্রান্ত হয়ে পড়েছি .... আমি হারিয়ে গেছি ...


1
কেবল একপাশে: var p = new Promise(function(resolve,reject){ reject(Error("hello world")); });আরও মূর্খতার সাথে এবং সংক্ষিপ্তভাবে লিখিত হতে পারে var p = Promise.reject(Error("hello world"));:-)
টিজে ক্রোডার

1
দুর্দান্ত প্রশ্ন।
টিজে ক্রোডার

উত্তর:


11

বাহ, এটা সত্যিই দুর্দান্ত। আমি কনসোলটি এর আগে কখনও দেখিনি। (এটির গতিশীল আচরণের অন্যান্য রূপ রয়েছে, যদিও, তাই ...) এখানে যা চলছে তা এখানে:

প্রথম ক্ষেত্রে, আপনার setTimeoutকলব্যাকের কোডের বাইরে সমস্ত কিছুর কোড এক্সিকিউশন সম্পূর্ণ হয় এবং এক্সিকিউশন স্ট্যাকটি ফিরে আসে যাতে কেবল " প্ল্যাটফর্ম কোড " (যেমন প্রতিশ্রুতি / এ + স্পপ বলছে) চলছে, ব্যবহারকারল্যান্ড জাভাস্ক্রিপ্ট কোড নয় (মুহুর্তের জন্য)। এই মুহুর্তে, প্রতিশ্রুতি প্রত্যাখ্যান করা হয়েছে এবং কোনও কিছুই প্রত্যাখ্যানকে পরিচালনা করতে পারে নি, সুতরাং এটি একটি নিয়ন্ত্রণহীন প্রত্যাখ্যান এবং দেবতুলরা এটিকে আপনার কাছে এটি প্রতিবেদন করে।

তারপরে , পাঁচ সেকেন্ড পরে, আপনার কলব্যাক চালিত হয় এবং একটি প্রত্যাখ্যান হ্যান্ডলার সংযুক্ত করে। এই মুহুর্তে, প্রত্যাখ্যান আর নিয়ন্ত্রণহীন is স্পষ্টতই, ক্রোম / ভি 8 / ডেভলগুলি কনসোল থেকে নিরীক্ষণযোগ্য প্রত্যাখ্যান সতর্কতা অপসারণ করতে একসাথে কাজ করে । পরিবর্তে আপনি যা দেখতে পান তা হ'ল আপনি যা প্রত্যাখ্যান হ্যান্ডলারের মাধ্যমে আউটপুট নিয়ে যান console.log। আপনি যদি তাড়াতাড়ি প্রত্যাখ্যান হ্যান্ডলারটি সংযুক্ত করেন তবে আপনি সেই অপ্রত্যাশিত প্রত্যাখ্যান ত্রুটি পাবেন না।

এটি পরিপূর্ণতার সাথে ঘটে না কারণ পরিপূরণ পরিচালনা না করা ত্রুটির শর্ত নয়। হ্যান্ডেলিং প্রত্যাখ্যান হয় না।


1
ওহ, এটা বোঝা যায়। আমি লক্ষ্য করেছি ফায়ারফক্স এটিকে কিছুটা ভিন্নভাবে পরিচালনা করে। তবে ঠিক আছে, এখন আরও বুদ্ধিমান।
জন

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