2014-11-07 11 views
1

Дано:Как обрабатывать круговые зависимости?

  • StringPreconditions расширяет ObjectPreconditions
  • ObjectPreconditions зависит от StringPreconditions (один из его методов возвращает подкласс)
  • Preconditions является привратник к ObjectPreconditions и StringPreconditions (убедившись, что они оба нагрузки до возвращения экземпляра)
  • User зависит от Preconditions

У меня есть этот код:

define(["ObjectPreconditions"], function(ObjectPreconditions) 
{ 
    console.log("Inside StringPreconditions"); 

    function StringPreconditions() {} 
    StringPreconditions.prototype = Object.create(ObjectPreconditions.prototype); 
    StringPreconditions.prototype.constructor = ObjectPreconditions; 
    return StringPreconditions; 
}); 

define(["require"], function(require) 
{ 
    console.log("Inside ObjectPreconditions"); 

    // Resolve circular dependencies 
    var StringPreconditions; 
    require(["StringPreconditions"], function(theStringPreconditions) 
    { 
    StringPreconditions = theStringPreconditions; 
    console.log("ObjectPreconditions finished loading StringPreconditions"); 
    }); 

    function ObjectPreconditions() {} 
    ObjectPreconditions.prototype.isInstanceOf(type) 
    { 
    console.log("ObjectPreconditions.isInstanceOf() invoked"); 
    if (type === String) 
     return new StringPreconditions(); 
    } 
}); 

define(["ObjectPreconditions", "StringPreconditions"], function(ObjectPreconditions, StringPreconditions) 
{ 
    console.log("Inside Preconditions"); 
    var Preconditions = {}; 

    Preconditions.requireThat(parameter) = function() 
    { 
    return new ObjectPreconditions(parameter); 
    }; 
    return Preconditions; 
}); 

define(["Preconditions"], function(Preconditions) 
{ 
    console.log("Inside User"); 
    function User() {} 
    User.prototype.doSomething = function() 
    { 
    var StringPrecondition = Preconditions.requireThat("test").isInstanceOf(String); 
    } 
}); 

Проблема состоит в том, что 10% времени я получаю этот порядок загрузки:

  • Внутри пользователя
  • Внутри Предпосылками
  • Внутри ObjectPreconditions
  • Внутренние строковые условия
  • ObjectPre conditions.isInstanceOf() (CRASH потому что StringPreconditions не определено)
  • ObjectPreconditions завершил загрузку StringPreconditions

Я уже читал http://requirejs.org/docs/api.html#circular, но я считаю, что они делают то же самое я.

Любые идеи?

ответ

1

Я понял: нам нужно создать файл «привратника», который будет определять функции, зависящие от круговых зависимостей.

  1. Переименовать ObjectPreconditions.js в AbstractObjectPreconditions.js.
  2. Создайте новый файл ObjectPreconditions.js (наш новый гейткипер).
  3. Перемещение любые циклические зависимости от AbstractObjectPreconditions.js в ObjectPreconditions.js
  4. кода пользователь должен require(ObjectPreconditions). Код, связанный с циклической зависимостью (например, подклассы), должен быть require(AbstractObjectPreconditions).

Вот что полученный код выглядит следующим образом:

define(["AbstractObjectPreconditions"], function(ObjectPreconditions) 
{ 
    console.log("Inside StringPreconditions"); 

    function StringPreconditions() {} 
    StringPreconditions.prototype = Object.create(ObjectPreconditions.prototype); 
    StringPreconditions.prototype.constructor = ObjectPreconditions; 
    return StringPreconditions; 
}); 

define(["require"], function(require) 
{ 
    console.log("Inside AbstractObjectPreconditions"); 

    function ObjectPreconditions() {} 
    return ObjectPreconditions; 
}); 

define(["AbstractObjectPreconditions"], function(ObjectPreconditions) 
{ 
    // Gatekeeper for circular dependencies 
    ObjectPreconditions.prototype.isInstanceOf(type) 
    { 
    console.log("ObjectPreconditions.isInstanceOf() invoked"); 
    if (type === String) 
     return new StringPreconditions(); 
    } 

    return ObjectPreconditions; 
}); 


define(["ObjectPreconditions", "StringPreconditions"], function(ObjectPreconditions, StringPreconditions) 
{ 
    console.log("Inside Preconditions"); 
    var Preconditions = {}; 

    Preconditions.requireThat(parameter) = function() 
    { 
    return new ObjectPreconditions(parameter); 
    }; 
    return Preconditions; 
}); 

define(["Preconditions"], function(Preconditions) 
{ 
    console.log("Inside User code"); 
    function User() {} 
    User.prototype.doSomething = function() 
    { 
    var StringPrecondition = Preconditions.requireThat("test").isInstanceOf(String); 
    } 
}); 
+1

это может быть правильным, но я считаю, очень трудно следовать, вы можете упростить имена переменных и т.д.? –

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