2016-10-24 2 views
0

Это тест для сайта, где я проверяю, существуют ли источники фотографий или нет, если они не хотят скрывать дополнительную панель, которая будет показывать эти фотографии, если они существуют. Проблема в том, что я не могу получить состояние breakVar = true;, и цикл тоже не остановится. Я пробовал разные способы, чтобы остановить его с помощью breaks/returns.Почему я не могу вырваться из этого цикла?

Я тестирую вывод testPhotos(currentProduct,display,breakVar);, и я хочу получить возврат «test-fail», чтобы я мог скрыть дополнительную панель.

Да, этот код стал уродливым, так как я отчаянно пытался проверить состояния при выполнении кода.

Я пытался поставить break; заявления в разных местах, но получаю ошибку «Illegal заявления перерыва»

я тест не в петле 8 раз в моей консоли.

var breakVar = false; 

function triggerPhotoFail(breakVar) { 
    breakVar = true; 
    consol.log('triggerPhotoFail ran'); 
    return "test-fail"; 
} 
function testPhotos(currentProduct,display,breakVar) { 
    for (var i = 0; i < 5; i++) { 
    // test if photos exists 
    if (breakVar === true) { 
     break; // get out of loop 
    } 
    var src = productArray[currentProduct]['subphoto-' + i]; 
    $.get(src) 
    .done(function() { 
     // photo exists 
    }) 
    .fail(function(breakVar) { 
     // photo does not exist 
     console.log('test failed in loop'); 
     breakVar = true; 
     triggerPhotoFail(); 
     console.log('breakVar change!: ' + breakVar); 
    }) 
    } 
    if (breakVar === true) { 
    console.log('breaker var tested true'); 
    return "test-fail"; 
    } 
    else { 
    return "not acknowledged"; 
    } 
} 

ответ

2

$.get является асинхронным. Цикл завершен доdone или fail функция была вызвана.

Вам необходимо заменить петлю for на итератор, который будет продвигаться при срабатывании функции done.

function testPhotos(currentProduct, display) { 
    // This starts the loop 
    var i = 0; next(); 

    function next() { 
    // This replaces the regular "end of for loop" check 
    if (i == 5) { 
     return; 
    } 

    $.get(src) 
     .done(function() { 
     // photo exists 
     i++; next(); // This does the "End of for loop increment" test and starts the next loop 
     }) 
     .fail(function(breakVar) { 
     // photo does not exist 
     console.log('test failed in loop'); 
     triggerPhotoFail(); 
     // We don't call `next()` here, which breaks the loop 
     }); 

    } 
} 
+0

хорошо, спасибо, я попробую, что – joehungjohn

+0

эй, это здорово, как вы вложили функцию внутри функции, которую она вызывает, по какой-либо причине? очиститель? – joehungjohn

+0

Он перестает быть «глобальным». – Quentin

0

Вы не прохождения каких-либо аргументов в вашей triggerPhotoFail() функции, которая в своем определении требует 1 параметр, а именно breakVar. Просто удалите все breakVar параметров из определений функций и вызовов (.fail(function()...), потому что breakVar сам уже глобальный.

+0

Да, я заметил, что раньше у меня не было параметров, но я решил, что добавлю его, чтобы увидеть, является ли это частью проблемы. закрыть право? в любом случае спасибо – joehungjohn

+0

Да, потому что если вы поместите параметр 'breakVar' в функцию, то его область будет локальной только для функции. –

+0

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