require.js有时不会触发回调函数

时间:2014-02-02 00:59:14

标签: javascript module callback requirejs

嗯,这就像我在两天内关于require.js的第三个问题,问题是我有一个包含以下模块的项目:

  1. main.js
  2. res.js
  3. juego.js
  4. 在主文件中,所有模块加载后必须调用的回调有时会被触发,有时不会

    我不会发布任何代码,因为我不相信它有什么问题,但我必须提到它不能成为加载顺序的问题,因为我的文件没有任何代码相互依赖。这是真的很奇怪,我的文件不是太大(首先有73行,第二行有18行)

    所以问题是,可能出现什么问题?一个require.js错误或其他什么?

    编辑:这是我模块的代码:

    main.js:

    require
    (
        ['cliente/juego', 'cliente/res'], 
        function (juego, res) 
        {
            function main () 
            {
                alert('ok');
            }
    
            window.addEventListener('load', main, false);
        }
    );
    

    res.js:

    define
    (
        function () 
        {
            return (function () 
            {
                var recursos = 
                {
                    soldado : { ruta : 'res/imagenes/soldados/1.png', tipo : 'Image', fuente : null }
                };
                var metodos = {};
                var cargados = 0;
                var totales = 0;
                var listos = false; // Todavía no se han cargado los recursos
    
                function terminarCarga (evento) 
                {
                    // Cada vez que se cargue un recurso se incrementará el progreso
                    cargados++;
    
                    if (cargados == totales) 
                    {
                        listos = true; // Recursos cargados y listos para usarse
    
                        // Acción a seguir una vez cargados todos los recursos
                    }
                }
    
                metodos.getTotales = function () 
                {
                    return totales;
                }
    
                metodos.getListos = function () 
                {
                    return listos;
                }
    
                metodos.cargar = function () 
                {
                    // Carga todos los recursos
    
                    var recurso;
    
                    for (var i in recursos) 
                    {
                        totales++;
                        recurso = recursos[ i ];
    
                        if (recurso.tipo == 'Image') 
                        {
                            recurso.fuente = new Image;
                            recurso.fuente.onload = terminarCarga;
                            recurso.fuente.src = recurso.ruta;
                        }
                        else
                        {
                            recurso.fuente = new Audio;
                            recurso.fuente.addEventListener('loadeddata', terminarCarga, false);
                            recurso.fuente.src = recurso.ruta;
                        }
                    }
                }
    
                metodos.get = function (nombre) 
                {
                    return recursos[ nombre ].fuente;
                }
    
                return metodos;
            })();
        }
    );
    

    juego.js:

    define
    (
        function () 
        {
            return (function () 
            {
                var metodos = {};
                metodos.getContexto = function () 
                {
                    // Recordar llamar ésta función una vez cargada la página
                    this.canvas = document.querySelector('canvas');
                    this.contexto = this.canvas.getContext('2d');
                }
    
                return metodos;
            })();
        }
    );
    

    主要功能中的警报仅在所有情况的10%中弹出。

2 个答案:

答案 0 :(得分:6)

问题不在于RequireJS或您如何使用RequireJS。问题是有时{/ 1}}事件在执行 load之前发生。我敢打赌,如果你将window.addEventListener('load', main, false);的正文更改为以下内容,它将始终有效:

main.js

您可能想要使用domReady plugin来处理这样的问题。类似的东西:

require(['cliente/juego', 'cliente/res'], function (juego, res) {
    console.log('ok');
});

答案 1 :(得分:0)

我之前看到过随机加载错误,不知道这是否是您所看到的原因。如果是这样,看看这个;有时Web服务器本身就是罪魁祸首。无论如何,这是我的情况。

https://groups.google.com/forum/#!msg/requirejs/x5Z-eZMzKwI/rbOSMNULftgJ

编辑:

每次都会调用回调。我在main中更改了代码,所以它看起来像这样:

require(
    ['cliente/juego', 'cliente/res'], 

    function (juego, res) {
        console.log(juego, res);

        function main () {
            alert('ok');
        }

        window.addEventListener('load', main, false);
    }
);

我在控制台中收到了这个输出:

Object {getContexto: function}

Object {getTotales: function, getListos: function, cargar: function, get: function}

编辑:

我认为这正是您所寻找的:http://requirejs.org/docs/api.html#pageload