Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 加载XML和JS以严格顺序处理它_Javascript_Mootools - Fatal编程技术网

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);
});