2015-02-04 4 views
1

Возможно ли (и как) прервать запрос RequireJS require?Как отменить запрос RequireJS 'require'?

Я хочу быть в состоянии сделать что-то вроде этого:

define([ 
    'Backbone.View' 
], 
function (BackboneView) { 

    var View = BackboneView.extend({ 

     initialize: function() { 

      // store require deferred 
      // (I know this is not possible in this way!) 
      // Is there a way to capture require deferred? 

      this.deferred = require(['someModule'], function() { 

       // do something 

      }); 

     }, 

     close: function() { 

      // abort require request if view is closed before request resolves 
      this.deferred.abort(); 

      this.remove() 

     } 

    }); 

    return View; 

}); 

Итак, я хочу, чтобы иметь возможность прервать require запрос, если Магистральная Посмотреть закрывается до require запроса решает.

Я проверил документацию RequireJS и их страницу GitHub. Нет ничего, описывающего, как справиться с этим.

Любая помощь приветствуется :) Tnx

ответ

1

RequireJS не обеспечивают средства для отмены require вызова ,

Я полагаю, что теоретически можно было бы реализовать его, но это усложняло бы требование RequireJS внутренним много за довольно редкие преимущества. Предположим, вам требуется foo, рассмотрим:

  1. Как часто ваш код фактически быть в положении, когда информация аннулирует require вызов желательно? Ваш взгляд должен быть инициализирован и закрыт быстро.

  2. Если foo уже неправдоподобным и инициализируется перед require вызов выдается задание толькоrequire должен сделать, это вернуть уже существующую ссылку на foo. Поэтому отменить практически нечего. Обратите внимание, что если для представления когда-либо разрешено полностью инициализировать даже только один раз в вашем приложении, здесь рассматривается сценарий.

  3. Если RequireJS был достаточно быстр, чтобы завершить вызов require до отмены, то отмена не действует. Когда приложение оптимизировано, вполне вероятно, что RequireJS завершит вызов до отмены. В оптимизированном приложении код, который работает require, находится в том же комплекте, что и требуемый код, поэтому RequireJS не нужно ничего извлекать из сети, чтобы удовлетворить вызов require.

Таким образом, в большинстве случаев отмена будет без эффекта, но и для тех случаев, когда RequireJS, возможно, придется отменить что-то, он должен держать близкий учет, который требует, что. Возможно, ваш запрос require на ваш взгляд является единственным, который требует foo, но foo также может потребоваться bar и baz.Если foo является только один требуя от них, а затем, если вы отмените require вызов, то RequireJS может отменить выборку данных и инициализации foo, bar и baz, но всегда есть вероятность того, что послеrequire выдаются, но перед тем он завершает другие часть потребностей вашего приложения baz. Поэтому теперь RequireJS должен помнить, что можно отменить foo и bar, но неbaz, потому что это было необходимо в другом месте.

+0

Большое спасибо за ваш ответ. Должен признаться, я не смотрел на это так, но ты прав. Предлагаете ли вы запускать оптимизацию (r.js) для всех модулей и файлов или только для некоторых и оставить другую динамически загруженной? – bulicmatko

+1

Добро пожаловать. Собирать ли все в одном файле или иметь несколько пакетов действительно зависит от деталей вашего приложения. В очень многих случаях объединение всего в один файл - это путь. Однако, если у вас есть приложение с дополнительными плагинами, нет веской причины объединять все вместе, особенно если плагины являются существенными. В этом случае основной пучок плюс один пучок для каждого плагина - это путь. – Louis

0

Ваш вопрос немного странно видеть будет развернут только один свернутое файл и не будет практически никакой задержки.

Для науки Обратите внимание, что требуется просто добавляет элемент сценария в DOM с некоторым proporties как data-requiremodule=[MODULE_NAME] так что вы можете в основном сделать что-то вроде:

function abortModuleLoad(moduleName) 
    var scripts = document.getElementsByTagName('script'); 
    for(var i = 0 ; i < scripts.length ; i++){ 
     if(scripts[i].dataset.requiremodule === moduleName) document.head.removeChild(scripts[i]) 
    } 
} 

close: function() { 

    // abort require request if view is closed before request resolves 
    abortModuleLoad("someModule"); 

    this.remove() 

} 
+0

Вы проверили это? Знаете ли вы, что удаление элементов 'script', добавленных RequireJS, на самом деле не приведет к тому, что RequireJS попадет в противоречивое состояние? – Louis

+0

Привет, raam86, спасибо за ваш ответ. Дело в том, что я не хочу запускать r.js. Таким образом, скрипты не будут уменьшены до одного файла. Некоторые файлы должны быть загружены только в некоторых случаях. Кроме того, перед созданием тега сценария в исходном файле сценария источник должен быть загружен динамически. Это действие, которое я хочу прервать, если вид закрыт, и запрос еще не разрешен. – bulicmatko

Смежные вопросы