Название говорит само за себя. Я нашел ответы (по поводу обратного вызова и еще кое-что), но не знаю, как применить это к своему коду.

Вопрос: как дождаться $ ("# layout-grid") .load (layout); завершено перед выполнением следующей строки?

Предупреждение в последней строке не будет отображаться при первом выполнении, потому что $ ("# layout-grid") .load (layout); еще не завершил загрузку. Однако предупреждение отображается правильно при втором выполнении.

function setLayout(selectedLayout) {
    layout += selectedLayout;
    $( "#layout-grid" ).load(layout); // this load is not finished yet before alert
    var top_level_div = document.getElementById('layout');
    var count = top_level_div.getElementsByTagName('div').length;
    alert(count);
}

Mes

Ответов: 4

Ответы (4)

Вы можете передать вызову .load () второй аргумент, который является обратным вызовом, который срабатывает, когда он будет выполнен. Смотрите здесь:

function setLayout(selectedLayout) {
    layout += selectedLayout;
    $( "#layout-grid" ).load(layout, function(){
        var top_level_div = document.getElementById('layout');
        var count = top_level_div.getElementsByTagName('div').length;
        alert(count);
    }); 
}

Надеюсь, это поможет.

$. Load () принимает необязательный аргумент callback. Вы должны поместить код, который должен быть выполнен после загрузки, в функцию, и передать эту функцию в $. Load.

Ваш пример будет выглядеть так:

function setLayout(selectedLayout) {
    layout += selectedLayout;
    $( "#layout-grid" ).load(layout, function afterLoad() {
        var top_level_div = document.getElementById('layout');
        var count = top_level_div.getElementsByTagName('div').length;
        alert(count);
    }); 
}

вы должны использовать функцию обратного вызова в jquery для примера, ваш код должен быть написан следующим образом

function setLayout(selectedLayout) {
layout += selectedLayout;
$( "#layout-grid" ).load(layout,function(){
      var top_level_div = document.getElementById('layout');
var count = top_level_div.getElementsByTagName('div').length;
alert(count);
});

подробности читайте здесь ссылка

удачи

К сожалению, в Javascript нет способа преобразовать асинхронный запрос в синхронный, потому что по некоторым непонятным мне причинам было решено, что в Javascript невозможно будет вложить циклы событий.

Например, невозможно написать что-то вроде alert (msg) в Javascript, и это так, потому что это ограничение было введено намеренно.

«Обходной путь» - использовать обратные вызовы ... т.е. вместо ожидания вам нужно указать, что делать (в другой функции), когда произойдет событие, которого вы ожидаете, если оно произойдет.

Существует StratifiedJs, который позволяет «ждать» асинхронных событий, скрывая сложность потока управления на основе обратного вызова, если вы действительно этого не хотите, но это компилятор, который принимает в качестве входных данных надмножество Javascript и генерирует Javascript .

2022 WebDevInsider