Halqa kesib oling

Keling, quyidagi kodni tasavvur qilaylik:

function DoSomethingHard(parameter1, parameter2, parameter3){
 //Do Something Hard Here
}

var i;
for(i = 0; i <= stuff.length; i++) {
 //"stuff" is an array
  DoSomethingHard(stuff[i].something1, stuff[i].something2, stuff[i].something3);
}

$( "#button_to_cancel" ).click(function() {
  //something to cancel
});
  • Masalan, «narsalar» ning 100 pozitsiyasi bor, shuning uchun loop ishlaydi 100 marta, ya'ni "Doim bir narsa qil" 100 marta bajariladi.
  • Shuningdek, "DoSomethingHard" ning ishga tushirilishi taxminan 5 soniya vaqtni oladi to'liq.

My question is: How do I manage the cancellation of "DoSomethingHard"? For example, if it has already run 50 times, how can I cancel the subsequent executions through a button? I did not succeed in my attempts and it always ends up running the whole loop ....

Oldindan rahmat :)

3
Bu anti-naqsh deb hisoblanadi, lekin siz global o'zgaruvchini yaratishingiz mumkin. var isBreak = noto'g'ri; (i = 0, i
qo'shib qo'ydi muallif Steve Tomlin, manba

7 javoblar

Javascript tekli tishli va tugallangandan so'ng, for loop amalga oshiriladi. Bekor qilish uchun vaqtni belgilash uchun bu kabi ishlarni qilardim.

function DoSomethingHard(param){
 //do something
}

var i = 0;
var loopInterval = setInterval(function() {
  if (i >= stuff.length) {
    clearInterval(loopInterval);
    return;
  }
  DoSomethingHard(stuff[i]);
  i++
}, 10);

$( "#button_to_cancel" ).click(function() {
  clearInterval(loopInterval);
});
2
qo'shib qo'ydi
Interval, narsalar [0] uchun DoSomethingHard ni amalga oshiradi, keyin bekor qilishni tekshiring. So'ngra, narsalar [1] uchun DoSomethingHard ni ishga tushiring, keyin bekor qilishni tekshiring. Va hokazo. Shunday qilib, agar kimdir tıkırtılar DoSomethingHard bir ijrosi o'rtasida bekor qilinsa, bu chaqiruv jarayoni bekor qilinishidan oldin tugaydi.
qo'shib qo'ydi muallif Jason P, manba
Lekin SetInterval to'liq ishga tushsa va DoSomethingHard() hali ham ma'lumotlarni ishlasa nima bo'ladi? Foydalanuvchi qanday qilib bekor qilishi mumkin?
qo'shib qo'ydi muallif Pedro Antônio, manba

You can make use of setInterval to call the function and when you have a click event you can clear the intervals

var mytimeout;


var i;
for(i = 0; i <= stuff.length; i++) {
 //"stuff" is an array
  mytimeout = window.setInterval(DoSomethingHard(stuff[i].something1, stuff[i].something2, stuff[i].something3), 2000);
}

$( "#button_to_cancel" ).click(function() {
  //something to cancel
  window.clearInterval(mytimeout)
});
1
qo'shib qo'ydi

Buni men ko'rgandek eng qulay usul:

function DoSomethingHard(parameter1, parameter2, parameter3){
//Do Something Hard Here
}

var i;
var active = true; //as of now, we want to process stuff
for(i=0;i<=stuff.length;i++){
//"stuff" is an array
if(active){
  DoSomethingHard(stuff[i].something1, stuff[i].something2, stuff[i].something3);
}else {
   active = true; //reset active in case we want to run loop again later on
   break;       //break out of loop
}
}

$( "#button_to_cancel" ).click(function() {
  active = false;
 });
1
qo'shib qo'ydi

Funktsiyangiz yo'qligida loop sinxronlashtirilganligini ta'kidlash kerak. DoSomethingHard() ni keyingi iteratsiya boshlanishidan oldin bajarish uchun döngü beklemeyecektir. Bir necha millisekundlarda DoSomethingHard deyarli yuz marta chaqirilgan! va sizning looping o'zingizga kelib qolsa, break bu erda foydalanilmaydi. Men hech qanday til tuzilishi bu erda yordam berolmaydi deb o'ylayman

Xo'sh, nima qilish kerak?

Funktsiyadagi biror narsa qilish yoki qilmaslik haqida qaror qabul qilishingiz kerak, buning uchun umumiy bayroqni yaratish va ning ichida funksiyani tekshirish kerak.

function DoSomethingHard(){
  if(flag50done){
    return;
  }else{
    //do what this fn was meant for
  }
}

You can change value of flag50done with a click of a button and further actions would get stopped due to the return

In case DoSomethingHard is some 3rd party function which you cannot modify you can wrap it in another function say runDecider

   function runDecider(a,b,c){
      //add flag check here
      if(flag50done){
        return;
      }else{
       DoSomethingHard(a, b, c);
      }
   }

va uni loopda chaqiring

var result;
for(i=0;i<=stuff.length;i++){
   result = runDecider(stuff[i].something1, stuff[i].something2, stuff[i].something3);
}
0
qo'shib qo'ydi

O'zingiz xohlagan tugmani bosish bilan uni bekor qila olmaysiz, agar siz döngünün o'rniga yineleme yoki yineleyiciler foydalanmasangiz. Lekin ba'zi bir shartlar bajarilganda loopni o'zida break. iborasi bilan bekor qilishingiz mumkin. Misol uchun, siz yozishingiz mumkin:

    var result;
    for(i=0;i<=stuff.length;i++){
      result = DoSomethingHard(stuff[i].something1, stuff[i].something2, stuff[i].something3);
      if (result === 'error' || i === 50) break;
    }

Natijada "xato" (yoki funktsiyadan ichkariga qaytib keladigan yana bir narsa) yoki 50 yoshga yetganda bu tugmachani tugatadi.

Endi men bu haqida o'ylayman, bir tugmani bosish mumkin, lekin ko'proq kod talab qiladi va samarasiz. menga bir daqiqa bering. Yangilash: Men bu pptternga ham maslahat bermayman, lekin juda moslashuvchan:

var exitCondition,
    doSomethingHard = function doSomethingHard(parameter1, parameter2, parameter3){
     //Do Something Hard Here
    },
    i,
    length = stuff.length,
    result;
for (i = 0; i <= length; i++) {
 //"stuff" is an array
  result = doSomethingHard(stuff[i].something1, stuff[i].something2, stuff[i].something3);
  if (exitCondition( result, i )) break;
}

$( "#button1_to_add" ).click(function() {
    exitCondition = function( result, index ) {
        return index === 50;
    });
});
$( "#button2_to_cancel" ).click(function() {
    exitCondition = null;
});

Bu yerda ko'rsatma, siz loop ichida tekshirgan chiqish holatini (yoki bir nechta) bo'lishi va tugmani bu holatni yangilashini ta'minlashi kerak.

0
qo'shib qo'ydi

UI o'zaro ta'siridan o'chirib tashlashni to'xtata olmaysiz, chunki har bir narsa bitta ish zarrachasida ishlaydi va sizning harakatingiz faqat loop to'liq bajarilgandan keyin bajariladi. @Jason p aytganidek, setInterval dan foydalanishingiz mumkin.

0
qo'shib qo'ydi

Men bu yo'lni hal qilaman:

function DoSomethingHard(parameter1, parameter2, parameter3){
    //Do Something Hard

    var timer = window.setInterval(function(){
    var page = $$('.page').data('page');
    console.log("The page is: "+page);
    if(page != 'preview'){
        //Cancel...

        console.log('Aborted');
        clearInterval(timer);
    }
 },1000);
}

Ya'ni, ko'lamni o'zgartirdim. Buning o'rniga tugmani bosish orqali foydalanuvchini sahifani tark etganda tomosha qilaman, shuning uchun uni bekor qiling.

0
qo'shib qo'ydi
Javascript UZB
Javascript UZB
99 ishtirokchilar

@js_uzb @vuejs_uz @react_uz @nodejs_uz @angular_uz @ngTashkent @yiiframework_uz @laravel_uz @linux_uzbek @python_uz @swift_uzb —————— @uzdevgroup @UzGeeksGroup ——— @UzDev_Jobs @jobs_uzb