2012-11-05 15 views
21

Yeni bir bağımlılığı hesaplayan, getiren ve daha sonra sonucu veren bir modül tanımlamak istiyorum. Bunun gibi:require.js Senkronizasyonu

define(['defaults', 'get_config_name'] function(defaults, get_config_name){ 
    var name = get_config_name(); 
    var config; 
    require.synchronous([configs/'+name'], function(a){ 
     config = defaults.extend(a); 
    }); 
    return config; 
}); 

Bunu yapmak için bir yol var mı, yoksa bu soruna saldırmanın daha iyi bir yolu var mı?

+1

Bunun için çalışmak için require.js'nin bir komut dosyası etiketini gövdeye eklemesi ve ardından komut dosyasının yüklenmesini denetlerken yürütmeyi askıya almak için bir süre döngüsüne atlanması gerekir. – Jake

cevap

17
  • Sen synchronous RequireJS callrequire('configs/'+get_config_name()) kullanmayı deneyebilirsiniz, ama zaten yüklü ise zaman uyumlu sadece bir modül yükleyecektir, aksi takdirde bir özel durum oluşturur. Yükleme modülü/JavaScript dosyası eşzamanlı olarak teknik olarak imkansızdır. UPD:Mümkün (bkz. Henrique'nin cevabı), ancak çok fazla önkoşul değildir. Tüm sayfanın donmasına neden olan JavaScript çalıştırmayı engeller. Yani, RequireJS bunu desteklemiyor. kullanımı durumda itibaren

  • o zaman uyumlu RequireJS gerekmez görünüyor, sen dönüş sonucu uyumsuz gerekir. AMD pattern bağımlılıkları tanımlamaya ve bunları eşzamansız olarak yüklemeye izin verir, ancak modülün fabrika işlevi sonucu eşzamanlı olarak döndürmelidir. , get_config_name() basit mantığı içerir ve başka modüllerin bağlı değildir

    // config_loader.js 
    define(['defaults', 'get_config_name'], function(defaults, get_config_name) { 
        return { 
         load: function (resourceId, require, load) { 
          var config_name = 'configs/' + get_config_name(); 
          require([config_name], function(config) { 
           load(defaults.extend(config)); 
          }) 
         } 
        } 
    }); 
    
    // application.js 
    define(['config_loader!'], function(config) { 
        // code using config 
    }); 
    
  • , daha iyi ve daha basit anında paths configuration option üzerinde hesaplama: çözelti yükleyici eklentisi (detaylar here ve here) kullanılarak olabilir veya yapılandırmanızın içeriğe bağlı olması durumunda - map configuration option.

    function get_config_name() { 
        // do something 
    } 
    require.config({ 
        paths: { 
         'config': 'configs/' + get_config_name() 
        } 
    }); 
    require(['application', 'defaults', 'config'], function(application, defaults, config) { 
        config = defaults.extend(config); 
        application.start(config); 
    }); 
    
13

JavaScript yüklüyor eşzamanlı teknik olarak mümkün değildir.

function loadJS(file){ 
    var js = $.ajax({ type: "GET", url: file, async: false }).responseText; //No need to append 
} 

console.log('Test is loading...'); 
loadJS('test.js'); 
console.log('Test was loaded:', window.loadedModule); //loadedModule come from test.js 
+0

Evet @Henrique, haklısınız. Cevabı yayınladıktan sonra bu tekniği keşfettim. Cevabı güncelledim. Teşekkür ederim! Bu arada: Sanırım aşağıya çekildiniz çünkü cevaba bir yorum olarak değil, ayrı bir cevap olarak yayınladınız. –

+0

Sorun değil. Cevap olarak yayınladım çünkü yorum göndermek için "itibar" a sahip değilim. – Henrique

+1

Sadece dosyayı getirip bir değişkene atamak onu çalıştıracaktır? Neyi kaçırıyorum? – marcus

İlgili konular