2013-01-23 2 views
5

Mam scenariusz, w którym mam zagnieżdżone wywołania require() w celu załadowania różnych modułów.RequireJS: zagnieżdżone wymagają wywołania

Czy istnieje sposób, aby upewnić się, że wszystkie wywołania require() i wszystkie jego elementy podrzędne wymagają() wywoływania są w pełni załadowane przed wywołaniem funkcji wywołania zwrotnego?

Czy istnieje sposób na określenie, że wywołania require() są synchroniczne?

function someFunction(callback) { 

    //top level require 
    require([...], function(...) { 

    //nested require 
    require([...], function(...) { 
    }); 

    //nested require 
    require([...], function(...) { 
    }); 

    }); 

    callback(); 
}; 
+0

Nie powinieneś używać zależności? – epascarello

+1

Tak. Staramy się jednak podzielić nasze rzeczy na osobne pliki. Na przykład powyższy kod znajduje się w FileA.js. FileB.js wywołuje someFunction() z wywołaniem zwrotnym. Jednak to wywołanie zwrotne jest zależne od niektórych ustawień, które występują w wywołaniach require() FileA.js. Problem polega na tym, że asynchroniczna natura wymagania oznacza, że ​​wywołanie zwrotne jest wykonywane przed ustawieniem zależności w wymaganiu(). – user657352

Odpowiedz

3

Trzeba wykonać callback w ostatnim require(...) funkcji:

function someFunction(callback) { 
    require(['somemodule'], function(someModule) { 
    // do stuff with someModule... 

    // execute callback 
    callback(); 
    }); 
} 

Co też mógł zrobić, to określić dependencies with the define function.

Przykład:

define('somemodule', ['somedependency'], function(someDependency) { 
    // return somemodule 
    return { 
    someProperty: someDependency.getProperty(); 
    }; 
}); 

function someFunction(callBack) { 
    var someModule = require('somemodule'); 
    var foo = someModule.someProperty; 

    return callBack(foo); 
} 
2

Jest na to sposób, aby require rozmowę synchronizację. Zrób to CommonJS styl:

var module = require('modulepath') 

Tak więc, jeśli chcesz NIE potrzebują funciton fabryka w swoim zagnieżdżonych wymagają połączeń, można „sync” require połączeń tamtędy ... Ale skoro ty jesteś out szczęścia.

Styl AMD requre(depsArray, factoryFn) jest dokładnie taki, jak popychanie kodu do równoległego wątku. Nie ma sposobu, aby uczynić go "synchronizowanym", ale możesz użyć "semaforów" do skoordynowania wyniku.

Odpowiedź na twoje pytanie zależy również w dużym stopniu od tego, co zagnieżdżone A i zagnieżdżonego B. Jeśli zależą one od jakiegoś produktu od góry wymaga jak więc absolutnie musi używać „semaforów gwintowanych” i nie można po prostu wcisnąć zagnieżdżone wymagają połączenia w nazwie określenie połączeń:

function someFunction(callback) { 

    var resultOfOuterCode = someResultOfCalculations 

    //top level require 
    require([...], function(...) { 

    var resultOfTopRequireCode = someOtherResultOfCalculations 

    var semaphore = { 
     'count': 2 // represents the number of thread that need to be "done" before 
     , 'callback':callback // this callback is fired. 
     , 'checkIfLast': function(){ 
     this.count -= 1 
     if (!this.count) { 
      // count is now 0 - time to run our callback 
      this.callback() 
     } 
     } 
    } 

    //nested require A 
    require([...], function(...) { 
     // using resultOfTopRequireCode // <-- !!!! this is important part 
     ... 
     semaphore.checkIfLast() 
    }); 

    //nested require B 
    require([...], function(...) { 
     // using resultOfTopRequireCode // <-- !!!! this is important part 
     semaphore.checkIfLast() 
    }); 

    }); 

}; 

Innymi słowy, tylko myśleć o require (dependsArray, factoryFn) jako "wątki" i stosuj swoje zrozumienie korzystania z wątków.