সূচী / পুনরাবৃত্তি সংখ্যা অনুযায়ী লুপের জন্য কীভাবে অন্তর্বর্তী সময় পরিবর্তনশীল?


12

যেহেতু আমি মন্তব্য করতে পারি না, তাই আমি এই পোস্টটি লিখতে বাধ্য হচ্ছি। আমি নীচের কোডটি পেয়েছি যা ঠিক 1 সেকেন্ড বা 1000 মিলিসেকেন্ডে বিলম্ব / অপেক্ষা করে -

let n = 5;
for (let i=1; i<n; i++)
{
  setTimeout( function timer()
  {
      console.log("hello world");
  }, i*1000 );
}

তবে আমি কীভাবে স্থির 1000 মিলিসেকেন্ডের পরিবর্তে আমি * 1000 সেকেন্ডে বিলম্ব করতে পারি তাই অপেক্ষার পুনরাবৃত্তি সংখ্যার উপর নির্ভর করে?

উদাহরণস্বরূপ, যদি n = 5 হয়, তবে আমি 1 ম পুনরুক্তিতে 1 সেকেন্ডের লুপটি বিলম্ব করতে চাই। দ্বিতীয় পুনরাবৃত্তিতে 2 সেকেন্ড, এবং এইভাবে .. চূড়ান্ত বিলম্ব 5 সেকেন্ড হবে।


2
সুতরাং আপনি 9 টাইমার বানাতে চান? যদি তা হয় তবে আপনার কোড আপনি যা চাইছেন তা করবে will এটি ঠিক 3 সেকেন্ড অপেক্ষা করে না। আসলে, টাইমারগুলি কখনই নির্ভুল হতে পারে না।
স্কট মার্কাস

1
আপনার প্রশ্নটির কোনও অর্থ নেই
ড্যানস্টার্নস

2
একটি কোডপেনে আপনার কোডটি কেবল চেষ্টা করে দেখুন: codepen.io/Connum/pen/BaaBMwW আপনি 9 টি বার্তা 3000 মিমি দূরে পাবেন - যদি আপনি এটি চান না তবে (তবে আপনার প্রশ্ন থেকে এটি যেমন শোনা যাচ্ছে) দয়া করে আপনার উদ্দেশ্যযুক্ত ফলাফলটি নির্দিষ্ট করুন হয়।
কনস্টান্টিন

1
আপনি বোঝেন কিভাবে setTimeout প্রথম স্থানে কাজ করে বলে মনে হচ্ছে না - এটা না একটি "বিলম্ব"। এই মুহুর্তে, আপনি আপনার সতর্কতাগুলি 3 সেকেন্ডের বিরতিতে পেয়ে যাচ্ছেন, কারণ আপনি ইতিমধ্যে 3000 দিয়ে বহুগুণ করেছেন i- যদি আপনি এটি না করেন, তবে আপনি একই সময়ে সমস্ত সতর্কতা পেয়ে যাবেন ।
04FS

3
আপনার শেষ বাক্যটি সাহসী করার জন্য প্রশ্নটি সম্পাদনা করা আসলেই আপনার ক্ষেত্রে সহায়তা করছে না। আপনাকে এখন একাধিক ভাষ্যকার দ্বারা বলা হয়েছে যে আপনার কোডটি ইতিমধ্যে যা আপনি চাইছেন তা করে (বা এটি আপনার উদ্দেশ্যযুক্ত ফলাফল না হলে আপনি প্রকৃতপক্ষে কী জিজ্ঞাসা করছেন তা পুরোপুরি পরিষ্কার নয়)।
কনস্টান্টিন গ্রো

উত্তর:


6

এখানে এমন একটি ফাংশন যা তাৎক্ষণিকভাবে প্রদর্শিত হবে, তারপরে 1 সেকেন্ড পরে, 2 সেকেন্ড পরে, 3 সেকেন্ড পরে etc. কোনও বিশেষ গণিত, কোনও প্রতিশ্রুতির দরকার নেই

const n = 5;
let cnt=0;

function show() {
  console.log("call "+cnt,"delay: ",cnt,"sec");
  cnt++;
  if (cnt > n) return; // we are done
  setTimeout(show, cnt*1000 ); // cnt seconds later
}
show()


1
আমি অত্যন্ত দুঃখিত যে আমি আপনার উত্তরটি মিস করেছি, এখানে অনেক মন্তব্য, ভুল বোঝাবুঝি, উত্তর ছিল ... যাইহোক আমি আপনার উত্তরটি বেছে নিচ্ছি কারণ আপনিই প্রথম একজন যিনি আপনার সময় স্যারকে ধন্যবাদ চেয়েছিলাম তা সমাধান করেছিলেন।
মাইক 12

@ মাইক লোল অন্যান্য সমাধানগুলি তাদের
নিজস্বভাবে

প্যাভানগুলি ES6 সিনট্যাক্সে একই। পড়া শক্ত তবে এটি আসলে একইরকম। এটি তৈরির জন্য তাঁর সম্পাদনাটি আমার লেখার সাথে সাথে তৈরি হয়েছিল :)
এমপিলুংজন

8

যদিও এই কাজটি প্রতিশ্রুতি, প্রতিক্রিয়াশীল স্ট্রিম এবং অন্যান্য শীতল সরঞ্জামগুলির দ্বারা সমাধান করা যেতে পারে (আরে, কেউ এখনও শ্রমিকদের ব্যবহারের পরামর্শ দেয়নি!), এটি সামান্য পাটিগণিত দিয়েও সমাধান করা যেতে পারে।

সুতরাং আপনি একটি সিকোয়েন্সে টাইমআউটগুলি চান: 1 এস, পূর্ববর্তী 1 + 2s, পূর্ববর্তী + 3s এবং আরও and এই ক্রমটি হল: 1, 3, 6, 10, 15 ... এবং এর সূত্রটি a[n] = n * (n + 1) / 2। জানে যে...

let n = 6;
console.log(new Date().getSeconds());

for (let i = 1; i < n; i++) {
  setTimeout(function timer() {
    console.log(new Date().getSeconds());
  }, 1000 * i * (i + 1) / 2);
}


গণিতবিদরা এখনও বেঁচে আছেন !! :)
বিলাল সিদ্দিকী

5

আপনি আপনার কোডটি সিরিয়াল করতে অ্যাসিঙ্ক / অপেক্ষা (প্রতিশ্রুতি) ব্যবহার করতে পারেন:

const waitSeconds = seconds => new Promise(resolve => setTimeout(resolve, seconds))

async function main () {
 let oldDate = new Date()
 let newDate
 
 /* 
  * If you put 'await' inside the loop you can synchronize the async code, and simulate
  * a sleep function
  */
 for (let i=1; i<5; i++) {
    await waitSeconds(i*1000)
    newDate = new Date()   
    console.log(`Loop for i=${i}, elapsed=${moment(newDate).diff(oldDate, 'seconds')} seconds`)
    oldDate = newDate
 }
 
 console.log('End')
}

main()
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>


5

আপনার প্রশ্নটি এক্সডিটি বোঝার জন্য আমাকে কিছু সময় নিয়েছে তবে আপনি কি এটি চান?

এটি প্রতিবার আই * 1000 দেরীতে কনসোল.লগ চালিয়ে যাবে। সুতরাং প্রথমবার এটি হবে 1 সেকেন্ড দীর্ঘ (1 * 1000), এর পরে এটি হবে 2 সেকেন্ড এবং আরও অনেক কিছু।

let i = 0;
loop = () => {
  setTimeout(() => {
    console.log(new Date()); // for clarity
    i++;
    if (i < 10) {
      loop();
    }
  }, i * 1000)
};
loop();


উদাহরণস্বরূপ, যদি n = 5 হয়, তবে আমি 1 ম পুনরুক্তিতে 1 সেকেন্ডের লুপটি বিলম্ব করতে চাই। দ্বিতীয় পুনরাবৃত্তিতে 2 সেকেন্ড, এবং এইভাবে .. চূড়ান্ত বিলম্ব 5 সেকেন্ড হবে।
মাইক

হ্যাঁ, এটি 1 ম পুনরাবৃত্তির জন্য 1 সেকেন্ড বিলম্বিত করবে, ২ য় সেকেন্ডের জন্য এবং আরও অনেক কিছু, এটি চেষ্টা করুন
Pavan Skipo

আপনার বিবরণ কোডের সাথে মেলে না। তবে এটি কাজটি করে
এমপ্লুঞ্জন

3

লুপ টাইমআউট ফাংশন শেষ হওয়ার জন্য অপেক্ষা করে না। সুতরাং, যখন লুপটি চালায় এটি প্রতিটি সূচকের জন্য আপনার সতর্কতার সময়সূচী করে।

আপনি এমন একটি ফাংশন ব্যবহার করতে পারেন যা আপনার সূচক অনুযায়ী চলবে তবে একই সময়ে নির্ধারিত। আপনি 3 সেকেন্ডের পার্থক্যটি অনুভব করতে পারেন।

function test(i){
    setTimeout( function timer(){
        console.log("hello world" + i);
    }, i*3000);
}
for (let i=1; i<4; i++) {
   test(i);
}

3

লুপের পরিবর্তে পুনরাবৃত্ত কলগুলি ব্যবহার করুন

let i=1;
function a(i) {
  if (i > 5)
    return
  else
    b("message", i)
}

function b(s, f) {
  setTimeout(function timer() {
    console.log(s + " " + f + " seconds");
  }, f * 1000);
  a(++i);
}
a(i);


উদাহরণস্বরূপ, যদি n = 5 হয়, তবে আমি 1 ম পুনরুক্তিতে 1 সেকেন্ডের লুপটি বিলম্ব করতে চাই। দ্বিতীয় পুনরাবৃত্তিতে 2 সেকেন্ড, এবং এইভাবে .. চূড়ান্ত বিলম্ব 5 সেকেন্ড হবে।
মাইক 12
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.