我在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); }); };
});
哪里出错?
答案 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();
};
});