Как повредить вложенные циклы в JavaScript? [дубликат]

Хорошо, я объяснил Вас проблема, вот возможное решение:

@implementation MyWindowController

volatile BOOL pageStillLoading;

- (void) runInBackground:(id)arg
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // Simmulate web page loading
    sleep(5);

    // This will not wake up the runloop on main thread!
    pageStillLoading = NO;

    // Wake up the main thread from the runloop
    [self performSelectorOnMainThread:@selector(wakeUpMainThreadRunloop:) withObject:nil waitUntilDone:NO];

    [pool release];
}


- (void) wakeUpMainThreadRunloop:(id)arg
{
    // This method is executed on main thread!
    // It doesn't need to do anything actually, just having it run will
    // make sure the main thread stops running the runloop
}


- (IBAction)start:(id)sender
{
    pageStillLoading = YES;
    [NSThread detachNewThreadSelector:@selector(runInBackground:) toTarget:self withObject:nil];
    [progress setHidden:NO];
    while (pageStillLoading) {
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    }
    [progress setHidden:YES];
}

@end

запускаются дисплеи индикатор хода выполнения, и получает основной поток во внутреннем runloop. Это останется там, пока другой поток не объявляет, что это сделано. Для пробуждения основного потока это заставит его обработать функцию без цели кроме пробуждения основного потока.

Это - всего один путь, как можно сделать это. Уведомление, отправляемое и обработанное на основном потоке, могло бы быть предпочтительным (также другие потоки могли зарегистрироваться для него), но решение выше является самым простым, я могу думать. BTW это не действительно ориентировано на многопотоковое исполнение. Чтобы действительно быть ориентированным на многопотоковое исполнение, каждый доступ к булевской переменной должен быть заблокирован объектом NSLock от любого потока (использующий такую блокировку, также делает "энергозависимым" устаревший, поскольку переменные, защищенные блокировкой, неявны энергозависимый согласно стандарту POSIX; стандарт C однако не знает о блокировках, таким образом, здесь только энергозависимый может гарантировать этот код для работы; GCC не нужно энергозависимый, чтобы быть установленным для переменной, защищенной блокировками).

189
задан Sebastian Simon 2 March 2018 в 03:43
поделиться

9 ответов

У вас должна быть возможность взломать метку, например:

function foo ()
{
    dance:
    for(var k = 0; k < 4; k++){
        for(var m = 0; m < 4; m++){
            if(m == 2){
                break dance;
            }
        }
    }
}
530
ответ дан 23 November 2019 в 05:37
поделиться
function myFunction(){
  for(var i = 0;i < n;i++){
    for(var m = 0;m < n;m++){
      if(/*break condition*/){
        goto out;
      }
    }
  }
out:
 //your out of the loop;
}
-8
ответ дан 23 November 2019 в 05:37
поделиться

Разрыв 1-го цикла:

for(i=0;i<5;i++)
{
  for(j=i+1;j<5;j++)
  {
    //do something

    break;
  }
  alert(1);
};

Разрыв обоих циклов:

for(i=0;i<5;i++)
{
  var breakagain = false;
  for(j=i+1;j<5;j++)
  {
    //do something

    breakagain = true;
    break;
  }
  alert(1);
  if(breakagain)
    break;
};
-1
ответ дан 23 November 2019 в 05:37
поделиться

break не принимает параметры. Есть два обходных пути:

  1. Оберните их в функцию и вызовите return

  2. Установите флаг во внутреннем цикле и снова прервите цикл сразу после цикла, если этот флаг установлен.

0
ответ дан 23 November 2019 в 05:37
поделиться

Используйте функцию для многоуровневых циклов - это хороший способ:

function find_dup () {
    for (;;) {
        for(;;) {
            if (done) return;
        }
    }
}
4
ответ дан 23 November 2019 в 05:37
поделиться

К сожалению, вы ' Придется установить флаг или использовать метки (вспомните старые инструкции goto)

var breakout = false;

for(i=0;i<5;i++)
{
    for(j=i+1;j<5;j++)
    {
        breakout = true;
        break;
    }
    if (breakout) break;
    alert(1)
};

Подход с метками выглядит так:

end_loops:
for(i=0;i<5;i++)
{
    for(j=i+1;j<5;j++)
    {
        break end_loops;
    }
    alert(1)
};

edit: метка размещена неправильно.

также см .:

11
ответ дан 23 November 2019 в 05:37
поделиться
loop1:
    for (var i in set1) {
loop2:
        for (var j in set2) {
loop3:
            for (var k in set3) {
                break loop2;  // breaks out of loop3 and loop2
            }
        }
    }

код скопирован из Лучший способ выйти из вложенных циклов в Javascript?

Пожалуйста, поищите, прежде чем отправлять вопрос. Ссылка была ПЕРВЫМ вопросом, который я увидел в левой части этой страницы!

20
ответ дан 23 November 2019 в 05:37
поделиться

См. Аарон. Иначе: j = 5; i = 5 вместо перерыв .

27
ответ дан 23 November 2019 в 05:37
поделиться

Вам нужно назвать внешний цикл и разорвать этот цикл, а не внутренний цикл - вот так.

outer_loop: 
for(i=0;i<5;i++) {
    for(j=i+1;j<5;j++) {
        break outer_loop;
    }
    alert(1);
}
40
ответ дан 23 November 2019 в 05:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: