কনসোল.লগ () async বা সিঙ্ক?


93

আমি বর্তমানে ট্রেভর বার্নহ্যামের অ্যাসিঙ্ক জাভাস্ক্রিপ্ট পড়ছি । এটি এখন পর্যন্ত একটি দুর্দান্ত বই হয়েছে।

তিনি এই স্নিপেট এবং কনসোল.লগ সম্পর্কে সাফারি এবং ক্রোম কনসোলে 'অ্যাসিঙ্ক' হওয়ার কথা বলেছেন। দুর্ভাগ্যক্রমে আমি এটি প্রতিলিপি করতে পারি না। কোডটি এখানে:

var obj = {}; 
console.log(obj); 
obj.foo = 'bar';
// my outcome: Object{}; 'bar';
// The book outcome: {foo:bar};

যদি এটি অ্যাসিঙ্ক হয় তবে আমি ফলাফলগুলি বইয়ের ফলাফল হিসাবে প্রত্যাশা করব। কনসোল.লগ () সমস্ত কোড কার্যকর না হওয়া পর্যন্ত ইভেন্টের কাতারে রাখা হয়, তারপরে এটি চালানো হয় এবং এতে বারের সম্পত্তি থাকবে।

এটি সমকালীনভাবে চলমান থাকলেও এটি উপস্থিত হয়।

আমি কি এই কোডটি ভুল চালাচ্ছি? কনসোল.লগ আসলে অ্যাসিঙ্ক?


@ থেফোর্তে: না, তাই আমার সম্ভবত আমার মন্তব্য মুছে ফেলা উচিত।
কুকি দৈত্য

4
আমি এটি ক্রোমে ঘটতে দেখেছি। আপনি যদি কোনও সাধারণ অবজেক্ট কনসোল.লগ করেন এবং তারপরে অবিলম্বে অবজেক্টে কিছু পরিবর্তন console.log()করেন তবে সর্বদা পূর্বের মানটি প্রদর্শন করে না। কাজটি যদি আপনার সাথে ঘটে তবে তা হ'ল আপনি যা চেষ্টা করছেন তা console.log()স্ট্রিংয়ে রূপান্তর করা যা অপরিবর্তনীয় তাই এই সমস্যাটির অধীন নয়। সুতরাং, অভিজ্ঞতা থেকে console.log()সম্ভবত কিছু প্রক্রিয়া সীমানা জুড়ে ডেটা মার্শালিং সম্পর্কিত async সমস্যা আছে। এটি উদ্দেশ্যমূলক আচরণ নয়, তবে console.log()অভ্যন্তরীণভাবে কীভাবে কাজ করে তার কিছু পার্শ্ব প্রতিক্রিয়া (আমি ব্যক্তিগতভাবে এটি একটি বাগ বিবেচনা করব)।
jਫਰ00


4
@ বার্গি আমাকে এই ডুপটিকে খুঁজতে 10 মিনিট সময় নিয়েছে (যদিও আমি সঠিক নামটি জানতাম), সম্ভবত এটি এটি দ্বিধাহীন। আমরা কি কেবল নকলটি অদলবদল করতে পারি না, যাতে অন্যটি দুপেই হয়ে যায় ...?
জোনাস উইলস 18

4
@ জোনাস উইলমস আমি এখন এই প্রশ্নটি আবার খুললাম ( ইতিহাস দেখুন )। আমি মনে করি না যে তারা একে অপরের সদৃশ, আমি কী ক্রমের জাভাস্ক্রিপ্ট কনসোলটি অ্যারেগুলি মূল্যায়ন করার বিষয়ে অলসভাবে ব্যবহার করি ? বিশেষত একটি অ্যারে জড়িত সমস্যার জন্য মূল লক্ষ্য হিসাবে।
বার্গি

উত্তর:


114

console.logমানসম্মত নয়, সুতরাং আচরণটি বরং অপরিজ্ঞাত, এবং বিকাশকারী সরঞ্জামগুলির প্রকাশ থেকে মুক্তি থেকে সহজেই পরিবর্তন করা যায়। আপনার বইটি সম্ভবত পুরানো হতে পারে, সম্ভবত আমার উত্তর শীঘ্রই।

আমাদের কোডে এটি console.logঅ্যাসিঙ্ক হোক বা না থাকায় কোনও পার্থক্য হয় না, এটি কোনও ধরণের কলব্যাক সরবরাহ করে না; এবং আপনি যে মানগুলি পাস করেছেন সেগুলি আপনি ফাংশনটি কল করার সময় সর্বদা রেফারেন্স এবং গণনা করা হয়।

তারপরে কী ঘটেছিল তা আমরা সত্যিই জানি না (ফায়ারব্যাগ, ক্রোম ডেভটোলস এবং অপেরা ড্রাগনফ্লাই সমস্ত ওপেন সোর্স)। কনসোলটির লগ করা মানগুলি কোথাও সঞ্চয় করতে হবে এবং এটি সেগুলি স্ক্রিনে প্রদর্শিত হবে। রেন্ডারিং নিশ্চিত হওয়ার জন্য অবিচ্ছিন্নভাবে ঘটবে (রেট-সীমা আপডেটে থ্রোলডড হওয়া), যেমন কনসোলে লগ-ইন করা অবজেক্টের সাথে ভবিষ্যতের মিথস্ক্রিয়া হবে (বস্তুর বৈশিষ্ট্য বাড়ানোর মতো)।

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

যাইহোক, আপনি যখন বস্তুটির বৈশিষ্ট্যগুলি আরও তদন্তের জন্য প্রসারিত করবেন তখন সম্ভবত কনসোলটি কেবলমাত্র আপনার অবজেক্ট এবং এর বৈশিষ্ট্যগুলির জন্য একটি রেফারেন্স সঞ্চিত করে রেখেছিল এবং এখনই এটি প্রদর্শিত হলে তাদের বর্তমান (ইতিমধ্যে রূপান্তরিত) অবস্থা প্রদর্শিত হবে। আপনি যদি ক্লিক করেন তবে আপনার উদাহরণটিতে সম্পত্তিটি +দেখতে পারা উচিত bar

এখানে একটি স্ক্রিনশট যা বাগ রিপোর্টে তাদের "ফিক্স" ব্যাখ্যা করতে পোস্ট করা হয়েছিল :

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

একটি কাজের ভিত্তি হ'ল সর্বদা আপনার বস্তুর সিরিয়ালযুক্ত স্ন্যাপশটগুলি লগ করা নিশ্চিত করা, যেমন করে console.log(JSON.stringify(obj))। এটি কেবলমাত্র বিজ্ঞপ্তিবিহীন এবং ছোট ছোট বস্তুর জন্য কাজ করবে। আরও দেখুন কীভাবে আমি সাফারিতে কনসোল.লগের ডিফল্ট আচরণটি পরিবর্তন করতে পারি?

ডিবাগিংয়ের জন্য ব্রেকপয়েন্টগুলি ব্যবহার করা আরও ভাল সমাধান, যেখানে কার্যকরভাবে বন্ধ হয়ে যায় এবং আপনি প্রতিটি বিন্দুতে বর্তমান মানগুলি পরীক্ষা করতে পারেন। কেবল সিরিয়্যাল এবং অপরিবর্তনীয় ডেটা দিয়ে লগিং ব্যবহার করুন।


4
কনসোল.লগ অ্যাসিঙ্ক না হওয়ার ক্ষেত্রে আমার একই সমস্যা ছিল। JSON.stringify আমার জন্য এটি সংশোধন করা হয়েছে ব্যবহার
russiansummer

2019 সালের হিসাবে, আমরা কি বলতে পারি যে console.logএটি 8 বছর বয়সী হিসাবে ক্রোমে এখনও অবিচ্ছিন্ন রয়েছে (দেখুন স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 873৮৯ 69 / / )), কেবলমাত্র যে পরিবর্তনটি ঘটে তা হ'ল ক্রোম এখন রেফারেন্স অবজেক্টের একটি স্ন্যাপশটকে আউটপুট দেয় আপনি যখন কল করবেন console.log(যদি আপনি লগ করা অবজেক্টটি প্রসারিত করেন, আপনি পরে তৈরি মিউটেশন অপারেশনের পরে এর চূড়ান্ত বৈশিষ্ট্য এবং মানগুলি দেখতে পাবেন console.log), বা console.logসত্যই সিনক্রোনাস হয়?
টোনিক্স

@ টোনিক্স হ্যাঁ, আমার উত্তরে বর্ণিত কারণগুলির কারণে এই আচরণটি পরিবর্তিত হওয়ার সম্ভাবনা নেই। এটি কোনও বাগ নয়, এটি একটি ইন্টারেক্টিভ ডিবাগার / ইন্সপেক্টর কীভাবে কাজ করে তা ঠিক।
বার্গি

আপনি যদি এখানেJSON.parse(JSON.stringify(obj)) মন্তব্যে উল্লিখিত হিসাবে ব্যবহার করেন তবে আপনি স্ট্রিংয়ের পরিবর্তে অবজেক্ট ফর্মটিতে স্ন্যাপশট পাবেন।
উইল্ট করুন

টিএল; ডিআরওয়ে ওয়ে ওয়ে টিএল
রিক

2

এটি আসলেই প্রশ্নের উত্তর নয়, তবে এই পোস্টটিতে হোঁচট খাওয়ার কারও পক্ষে এটি কার্যকর হতে পারে এবং একটি মন্তব্য করা খুব দীর্ঘ ছিল:

window.console.logSync = (...args) => {
  try {
    args = args.map((arg) => JSON.parse(JSON.stringify(arg)));
    console.log(...args);
  } catch (error) {
    console.log('Error trying to console.logSync()', ...args);
  }
};

এটি সিউডো-সিঙ্ক্রোনাস সংস্করণ তৈরি করে console.logতবে গ্রহণযোগ্য উত্তরে উল্লিখিত একই ক্যাভেটস সহ।

যেহেতু মনে হচ্ছে, এই মুহুর্তে, বেশিরভাগ ব্রাউজারগুলি console.logকোনও উপায়ে অ্যাসিনক্রোনাস হয়, আপনি কিছু নির্দিষ্ট পরিস্থিতিতে এর মতো কোনও ফাংশন ব্যবহার করতে চাইতে পারেন।


0

কনসোল.লগ ব্যবহার করার সময়:

a = {}; a.a=1;console.log(a);a.b=function(){};
// without b
a = {}; a.a=1;a.a1=1;a.a2=1;a.a3=1;a.a4=1;a.a5=1;a.a6=1;a.a7=1;a.a8=1;console.log(a);a.b=function(){};
// with b, maybe
a = {}; a.a=function(){};console.log(a);a.b=function(){};
// with b

প্রথম পরিস্থিতিতে অবজেক্টটি যথেষ্ট সহজ, সুতরাং কনসোলটি 'স্ট্রিংফাইজ' করতে পারে তারপরে এটি আপনার কাছে উপস্থিত হবে; তবে অন্যান্য পরিস্থিতিতে, 'স্ট্রিংফাই' করার জন্য একটি খুব 'জটিল' সুতরাং কনসোল আপনাকে পরিবর্তে মেমরি অবজেক্টটি প্রদর্শন করবে এবং হ্যাঁ, আপনি যখন এটি দেখবেন খ ইতিমধ্যে একটি এর সাথে সংযুক্ত হয়ে গেছে।


আমি জানি এই প্রশ্নটি 3 বছরের পুরানো তবে এই মুহূর্তে আমি একই সমস্যায় চলেছি - অবজেক্টটি সিরিয়াল করা আমার পক্ষে কাজ করে না কারণ এটি খুব জটিল। আমি এটির ডেটা অ্যাক্সেস করার চেষ্টা করে একটি ইভেন্ট ধরছি তবে কোনওভাবে কোডে এটির কোনও ডেটা নেই তবে কনসোল.লগে এটিতে ডেটা রয়েছে।
স্কেইক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.