सूचकांक / पुनरावृत्ति संख्या के अनुसार अंतराल समय को गतिशील रूप से कैसे बदलें?


12

चूँकि मैं टिप्पणी नहीं कर सकता, इसलिए मुझे यह पोस्ट लिखने के लिए मजबूर होना पड़ा। मुझे नीचे कोड मिला है जो देरी करता है / ठीक 1 सेकंड या 1000 मिलीसेकंड इंतजार करता है -

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

लेकिन मैं इसे निर्धारित 1000 मिलीसेकंड के बजाय i * 1000 सेकंड कैसे देरी कर सकता हूं, इसलिए प्रतीक्षा पुनरावृत्ति संख्या पर निर्भर करती है?

उदाहरण के लिए, यदि n = 5, तो मैं 1 पुनरावृत्ति में 1 सेकंड की देरी चाहता हूं। दूसरे पुनरावृत्ति में 2 सेकंड, और इतने पर .. अंतिम देरी 5 सेकंड होगी।


2
तो आप 9 टाइमर बनाना चाहते हैं? यदि ऐसा है, तो आपका कोड वही करेगा जो आप पूछ रहे हैं। यह वास्तव में 3 सेकंड इंतजार नहीं करता है। वास्तव में, टाइमर कभी भी सटीक नहीं होंगे।
स्कॉट मार्कस

1
आपके सवाल का कोई मतलब नहीं है
DanStarns

2
बस एक कोडपेन में अपना कोड आज़माया: codepen.io/Connum/pen/BaaBMwW आपको 9 संदेश 3000ms के अलावा मिलते हैं - यदि वह नहीं है जो आप चाहते हैं (लेकिन आपके प्रश्न से यह ध्वनि जैसा लगता है), कृपया निर्दिष्ट करें कि आपका इच्छित परिणाम क्या है है।
कॉन्स्टेंटिन

1
आप समझते हैं कि कैसे setTimeout पहली जगह में काम करता है नहीं है - यह है नहीं एक "देरी"। अभी, आप 3 सेकंड के अंतराल में अपने अलर्ट प्राप्त कर रहे हैं, क्योंकि आपने पहले से ही 3000 के साथ गुणा किया है i- यदि आपने ऐसा नहीं किया, तो आपको एक ही समय में सभी अलर्ट मिलेंगे ।
04FS

3
अपने अंतिम वाक्य को बोल्ड बनाने के लिए प्रश्न का संपादन करना वास्तव में आपके मामले में मदद नहीं कर रहा है। अब आपको कई टिप्पणीकारों द्वारा बताया गया है कि आपका कोड पहले से ही वही कर रहा है जो आप पूछ रहे हैं (या यों कहें, यह बिल्कुल स्पष्ट नहीं है कि आप वास्तव में क्या पूछ रहे हैं, यदि यह आपका इच्छित परिणाम नहीं है)।
कॉन्सटेंटिन ग्रो

जवाबों:


6

यहाँ एक फ़ंक्शन है जो तुरंत दिखाएगा, फिर 1 सेकंड बाद, 2 सेकंड बाद, 3 सेकंड उसके बाद आदि। कोई विशेष गणित, कोई वादे की आवश्यकता नहीं

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
मुझे इस बात का बेहद अफ़सोस है कि मैं आपका जवाब देने से चूक गया, बहुत सारी टिप्पणियां, गलतफहमी, जवाब थे ... वैसे भी मैं आपका जवाब चुन रहा हूं क्योंकि आप पहले वही थे, जो मैंने आपके समय के लिए धन्यवाद मांगा था।
माइक

@ मायके लोल। अन्य समाधान अपने आप में उपयोगी हैं, इसलिए स्वीकार करने के लिए धन्यवाद
mplungjan 13

ईएस 6 सिंटैक्स में पावन समान है। पढ़ने के लिए कठिन लेकिन यह वास्तव में एक ही है। इसे संपादित करने के लिए उसका संपादन उसी समय किया गया था जब मैंने मेरा लिखा था :)
mplungjan

8

हालांकि इस कार्य को वादों, प्रतिक्रियाशील धाराओं और अन्य शांत उपकरणों के साथ हल किया जा सकता है (हे, किसी ने श्रमिकों का उपयोग करने का सुझाव नहीं दिया है!), इसे थोड़ा अंकगणित के साथ भी हल किया जा सकता है।

तो आप एक क्रम में टाइमआउट चाहते हैं: 1s, पिछले एक + 2 s, पिछले एक + 3 s, और इसी तरह। यह क्रम है: १, ३, ६, १०, १५ ... और इसका सूत्र है 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

आप अपने कोड को क्रमबद्ध करने के लिए async / प्रतीक्षा (वादे) का उपयोग करके देख सकते हैं:

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

अपना प्रश्न xD समझने के लिए मुझे कुछ समय दिया, लेकिन क्या आप यही चाहते हैं?

यह हर बार i * 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 सेकंड में देरी करेगा, 2 सेकंड के लिए 2 सेकंड और इतने पर, इसे आज़माएं
पावन स्किप्टो

आपका विवरण कोड से मेल नहीं खाता है। लेकिन यह काम करता है
mplungjan

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 सेकंड होगी।
माइक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.