Javascript 加载XML和JS以严格顺序处理它
我目前正在构建一个自定义序列化函数。这会使数组变成这样Javascript 加载XML和JS以严格顺序处理它,javascript,mootools,Javascript,Mootools,我目前正在构建一个自定义序列化函数。这会使数组变成这样 {user_ids: [1,2,3], types: ['foo', 'bar']} 变成这样的字符串: ui-1,2,3,,ty-foo,bar 我有一个XML文件,它告诉我“用户ID”映射到“ui”,等等。我用它将XML文件转换成JavaScript可以使用的东西 我希望将缩写存储在本地存储中,以便下次需要它们时,不需要获取XML文件或再次运行XML2JSON javascript。然而,我很难让每件事都按正确的顺序执行 缩写函数可
{user_ids: [1,2,3], types: ['foo', 'bar']}
变成这样的字符串:
ui-1,2,3,,ty-foo,bar
我有一个XML文件,它告诉我“用户ID”映射到“ui”,等等。我用它将XML文件转换成JavaScript可以使用的东西
我希望将缩写存储在本地存储中,以便下次需要它们时,不需要获取XML文件或再次运行XML2JSON javascript。然而,我很难让每件事都按正确的顺序执行
缩写函数可以从页面的各个部分多次调用。它做的第一件事是检查本地存储是否已满。如果不是,则必须加载XML,执行XML2JSON,结果必须放在本地存储中,然后才能继续
Asset.javascript有一个onLoad(),请求有onComplete,但它们并没有很好地等待彼此(看起来Asset.javascript无论如何都是异步的)
我曾尝试在每个函数中使用带有callChain()的Chain(因此它们只有在真正完成自己的部分后才能继续),但我仍然不得不返回一些东西——缩写函数的结果——我无法理解
var Shorten = {
dict: [],
compact: function(args){
if(dict.length == 0){
// Check local storage
if(!localStorage.dict){
new Request({
url: 'shorten.xml',
contentType: 'application/xml',
method: 'get',
onSuccess: (function(rdf){
Asset.javascript('xml2json.js', {
id: 'xml2json',
onLoad: (function(){
var x2js = new X2JS();
var jsonObj = x2js.xml_str2json(rdf);
var dict = [];
jsonObj.parameters.alias.each(function(alias){
dict[alias._long] = alias._short;
});
localStorage.dict = dict;
})
});
})
}).send();
}
else{
this.dict = localStorage.dict;
}
}
else{
args.each(function(item){
// Check dictionary and replace with abbreviated version.
});
}
}
};
您无法通过立即返回来以任何有意义的方式解决此问题,您需要处理两个异步方法 您可以按照以下步骤进行重构(5分钟内完成,但您得到了回调的想法): 我还没有机会测试这一点,但它应该会让你走上正确的道路 解决后,模式实际上存储在localStorage中,因此后续调用将快速返回-您还可以重构模式,使其成为返回模块的先决条件,并使其像
var shortString=Shorten.compact(args)一样同步代码>-但是您需要事先嵌套模式调用-如果您知道需要这样做,您也可以这样做
您还可以预加载xml2json.js
,这样就不必依赖Asset.javascript
JIT延迟加载,这意味着您只需一次异步调用即可更快地处理模式。为了链接和立即返回值,您甚至可以使ajax请求同步(阻塞UI),尽管回调/承诺是这类东西的正常模式
p、 dict是一个对象
散列,不是一个数组
你能把你的代码也发布出来以完成你的描述吗?当然。我已经添加了代码——当然这不会起作用,因为当它完成它的工作时,它会很高兴地在if语句之外继续,但是当我试图包装请求和资产调用以强制它们按顺序执行时,这就是我得到的结果。这一行if(dict.length==0){
不允许调用您知道的请求。我仍然不理解这个问题。请求在其onSuccess
上调用资产,因此它总是在请求之后。您不能让它们“按顺序执行”是什么意思?OK-当Shorten类发现dict为空时,这意味着第一次调用compact函数。因此,我首先尝试将localStorage的内容放在Shorten类中(尽管我现在意识到,并且使用Dimitar的回答,这是多余的)。当localStorage为空时,这意味着我必须首先通过加载RDF并对其进行解析并将结果转储到localStorage中来填充它,但我必须先等待它完成,然后才能开始运行压缩功能。感谢您的广泛回复。我将对此进行尝试并进行报告。
var Shorten = {
getSchema: function(rdf, done){
Asset.javascript('xml2json.js', {
id: 'xml2json',
onLoad: function(){
var x2js = new X2JS(),
jsonObj = x2js.xml_str2json(rdf),
dict = {};
jsonObj.parameters.alias.each(function(alias){
dict[alias._long] = alias._short;
});
localStorage.setItem('dict', JSON.encode(dict));
done(dict);
}
});
},
compact: function(args, done){
var self = this,
dict = localStorage.getItem('dict'),
process = function(dict){
args.each(function(item){
// Check dictionary and replace with abbreviated version.
});
done();
};
if (!dict){
// Check local storage
new Request({
url: 'shorten.xml',
contentType: 'application/xml',
method: 'get',
onComplete: this.getSchema.bind(this, process)
}).send();
} else {
process(JSON.decode(dict));
}
}
};
Shorten.compact([{user_ids: [1,2,3], types: ['foo', 'bar']}], function(result){
console.log(result);
});