1

我在 RequireJS 中有一个模块:

定义(['jquery','jsonLoader'],函数($,jsonLoader){

function buildMenu()
{   
    jsonLoader('system/models/build/menu.json', function(data){
        var output='';
        // ...
        return output;
    });

}    

return {
    buildMenu : buildMenu
}
 })

执行buildMenu()函数后,返回“未定义”(因为中定义的回调jsonLoader()没有执行)。我在这里调用函数:

定义([“jquery”,“核心”,“模板”,“jsonLoader”,“调试器”],函数($,核心,模板,jsonLoader){

var config,
    debug; 

$(function() {             
    jsonLoader('system/config.json',function(data){
        config = data;
        init();
    });
});

function init()
{
    debug = new $.fn.debug;        

    if(config.application.debug == true)
        debug.enabled = true

    // Build menu
    debug.log("Building Menu...");
    console.log ( template.buildMenu() );
}
 });

jsonLoader 看起来:

定义([“jquery”],函数($){

 return function(name, callback){
           $.get(name, function(data){
              callback(data);
           });   
  };

});

哪里出错了?

4

1 回答 1

1
define(['jquery', 'jsonLoader'], function($, jsonLoader){

    function buildMenu(callback)
    {   
        jsonLoader('system/models/build/menu.json', function(data){
            var output='';
            // ...
            callback(output);
        });

    }    

    return {
        buildMenu : buildMenu
    }
});

你叫它的地方

define(["jquery", "core", "template", "jsonLoader", "debugger"], function($, core, template, jsonLoader) {

    ...

    function init()
    {
        ...
        template.buildMenu(function(output) { console.log(output); } );
    }
});

Promise 简介

现在,所有这些回调的东西,如果你进一步嵌套它,可能会失控。使用 jQuery Deferred,它看起来像这样:

define(['jquery', 'jsonLoader'], function($, jsonLoader){

    function buildMenu()
    {
        var d = $.Deferred();
        jsonLoader('system/models/build/menu.json', function(data){
            var output='';
            // ...
            d.resolve(output);
        });
        return d.promise();
    }

    return {
        buildMenu : buildMenu
    }
});

define(["jquery", "core", "template", "jsonLoader", "debugger"], function($, core, template, jsonLoader) {

    var config,
        debug; 

    $(function() {             
        jsonLoader('system/config.json').success(function(data){
            config = data;
            init();
        });
    });

    function init()
    {
        debug = new $.fn.debug;        

        if(config.application.debug == true)
            debug.enabled = true

        // Build menu
        debug.log("Building Menu...");
        console.log ( template.buildMenu().success(function(output){console.log(output);}) );
    }
});

define(["jquery"],function($){

    return function(name){
        var d = $.Deferred();
        $.get(name, function(data){
            d.resolve(data);
        });
        return d.promise();
    };
});
于 2013-06-11T17:46:14.257 回答