2013-10-09 3 views
2

У меня есть простой класс перевода (модуль), который обрабатывает локализацию для моего приложения. Внутри класса translate я загружаю необходимые языковые модули с требуемой функцией.Требование: Ожидание выполнения функции внутри модуля

define(['require', 'config', 'store'], 
function(require, Config, Store) { 
    // Using ECMAScript 5 strict mode during development. By default r.js will ignore that. 
    'use strict'; 

    var translation = { 
     locale: null, 
     name: null, 
     keys: null, 
     timezones: null 
    }; 

    var languageCode = Store.getInstance().get('LanguageCode') || Config.defaultLanguageCode; 

    require(['translation/' + languageCode], function(trans) { 
     translation = trans; 
    }); 

    var get = function(key) { 
     return (!!translation.keys && translation.keys[key]) ? translation.keys[key] : key; 
    }; 

    var timezone = function(key) { 
     return (translation.timezones[key]) ? translation.timezones[key] : key; 
    }; 

    return { 
     _: get, 
     timezone: timezone, 
     timezones: function() { 
      return translation.timezones; 
     } 
    }; 
}); 

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

+1

вы должны проверить [i18n requirejs плагин] (https://github.com/requirejs/i18n) это сделает вашу жизнь легко – sergiofbsilva

+1

Спасибо. Я это проверю. – 3rfan

ответ

-1

Я нашел решение вашей конкретной проблемы без использования обещаний. Я использую функцию WaitFor для ожидания загрузки модуля require().

Это как мой модуль App выглядит следующим образом:

define("App", ["Config"], function() { 

    var queue = []; 
    var fetchingId, cb; 

    var App = { 
     Dialog: null 
    }; 

    require(["FloDialog"], function() { 
     App.Dialog = new FloDialog(); 
    }); 

    return { 
     WaitFor: function (id, callback) { 
      if (!fetchingId) { 
       fetchingId = id; 
       cb = callback; 
       require([id], function() { 
        cb(App); 
       }); 
      } else { 
       queue.push([id, callback]); 
      } 
     } 
    }; 
}); 

Обратите внимание на WaitFor функции в нижней части. Когда мне требуется приложение модуля, как показано ниже, я использую функцию WaitFor, чтобы буквально дождаться загрузки зависимости в require(). Когда он будет готов, в моем случае я возвращаю переменную App, которая теперь содержит App.Dialog var (и загружается с экземпляром класса FloDialog).

На некоторых-page.html:

<script type="text/javascript"> 
    require(['App'], function (App) { 

     App.WaitFor('FloDialog', function(App) { 
      console.log(App.Dialog); // Yay! The instance is loaded and good to go! 
     }); 

</script> 
Смежные вопросы