功能中的回调似乎没有在Require.JS中执行

时间:2013-06-11 17:09:02

标签: javascript jquery json requirejs

我在RequireJS中有一个模块:

  

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

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

}    

return {
    buildMenu : buildMenu
}
 })

执行buildMenu()函数后,返回“undefined”(因为jsonLoader()中定义的回调不能执行)。我在这里打电话给这个功能:

  

define([“jquery”,“core”,“template”,“jsonLoader”,“debugger”],   函数($,core,template,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);
           });   
  };
     

});

哪里出错?

1 个答案:

答案 0 :(得分: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); } );
    }
});

承诺简介

现在,所有这些回调的东西,如果你进一步嵌套,可能会失控。使用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();
    };
});