Несколько условий с yepnope

Я использую yepnope.js в качестве загруженного ресурса. Я хочу выполнять код в моем JS-модуле только тогда, когда все зависимости для этого модуля загружены. Я не хочу загружать зависимости JS, которые уже были загружены.

Предположим, у меня есть зависимости D1.js и D2.js. Я пытался

yepnope({
    load: ['D1.js', 'D2.js],
    complete: function() {
        //execute my code here
    }
});

Это работает, но ресурсы загружаются каждый раз, даже если они уже были загружены ранее.

Если я сделаю несколько таких тестов:

yepnope([{
    test: $().d1,
    nope: 'D1.js'
},
{
    test: $().d2,
    nope: 'D2.js'
}]);

Непонятно, куда поместить общую функцию completed — ту, которая запускается после загрузки всех ресурсов.

Можно ли это сделать с помощью yepnope, или мне нужно использовать другой компонент?

Спасибо.


person user1044169    schedule 08.09.2012    source источник


Ответы (2)


Обратные вызовы запускаются после выполнения соответствующих скриптов (а не только загрузки). Все сценарии выполняются по порядку, поэтому, если вы поместите свойство callback или complete в последний объект, он будет выполняться последним.

person Alex Sexton    schedule 08.09.2012
comment
Алекс, у меня все еще возникают проблемы с использованием нескольких условий, когда полный метод присоединяется к последнему условию. Появляется, если последнее условие TRUE, а предыдущие условия FALSE, полный метод не ждет и выполняется до того, как будут загружены все скрипты из ложных условий. Это ожидается? Это ошибка? Спасибо. - person user1044169; 13.09.2012
comment
Алекс, не могли бы вы также прокомментировать мое предыдущее утверждение о свойстве загрузки yepnope: это работает, но ресурсы загружаются каждый раз, даже если они уже были загружены ранее. Это действительно правильное предположение? Если во время жизни страницы я попытаюсь загрузить один и тот же ресурс .JS через свойство load, будет ли файл физически загружен несколько раз? Спасибо. - person user1044169; 13.09.2012
comment
Если тест false, скрипты не загружаются. Это почти все функциональные возможности yepnope ;) -- Что касается свойства load, у нас есть некоторые проверки, чтобы не загружать скрипты дважды, но я не предлагаю создавать решение, которое полностью полагается на эту функцию, поскольку вы, вероятно, заблудитесь. другие места. - person Alex Sexton; 13.09.2012

Допустим, вам нужно условно загрузить jquery.js, jquery.jgrowl.js и jquery.powertip.js. Вы ожидаете, что следующий код будет работать:

yepnope([{
  test: typeof(window.jQuery) === 'undefined' || 
        jQuery.fn.jquery.match(/^1\.[0-9]+/) < 1.7,
  yep: '//cdnjs.cloudflare.com/ajax/libs/jquery/2.0.0/jquery.min.js'
},
{
  test: typeof(window.jQuery) === 'undefined' 
        || typeof(window.jQuery.fn.jGrowl) === 'undefined',
  yep: ['//cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.2.12/jquery.jgrowl.min.js',
        '//cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.2.12/jquery.jgrowl.css'],
  complete: function() {
    console.log('completed loading jGrowl (should fire first, or not at all)');
  }
},
{
  test: typeof(window.jQuery) === 'undefined' 
        || typeof(window.jQuery.fn.powerTip) === 'undefined',
  yep: ['//cdnjs.cloudflare.com/ajax/libs/jquery-powertip/1.1.0/jquery.powertip.js', 
        '//cdnjs.cloudflare.com/ajax/libs/jquery-powertip/1.1.0/jquery.powertip.min.css'],
  complete: function() {
    console.log('completed loading powertip'); 
    jQuery.jGrowl("Growling!");
  }
}
]);

Однако, если это выполняется на странице, где jquery.powertip.js уже загружен, а jquery.jgrow.js нет, это приведет к ошибке из-за того, что обратный вызов «complete» запускается сразу, а не когда все файлы загружаются.

Следующая скрипта демонстрирует эту ошибку с yepnope 1.5.4: http://jsfiddle.net/dergachev/HHxK2/

Также обратите внимание, что в текущем транке (главной ветке) yepnope эта ошибка исчезает. Вероятно, это связано со следующими билетами (которые никогда не переносились в 1.5.4):

person Dergachev    schedule 10.05.2013