Javascript 我收到未定义的xml对象。为什么?

Javascript 我收到未定义的xml对象。为什么?,javascript,jquery,Javascript,Jquery,我有两个js文件。一个是route.js,第二个是xml.js。在route.js文件中,我正在调用xml.js中的一个函数。该函数的作用是通过xml链接解析并返回xml对象。当我在xml.js中执行console.log($(xml))时,它会显示xml,但当我返回此对象并执行console.log(xml.init(param,param,param))时,它会返回未定义的。为什么? 这是我的密码 route.js var Route = { fromurl : null,

我有两个js文件。一个是
route.js
,第二个是
xml.js
。在
route.js
文件中,我正在调用
xml.js
中的一个函数。该函数的作用是通过xml链接解析并返回xml对象。当我在xml.js中执行
console.log($(xml))
时,它会显示xml,但当我返回此对象并执行
console.log(xml.init(param,param,param))
时,它会返回
未定义的
。为什么?

这是我的密码

route.js

var Route = {
    fromurl : null,
    tourl   : null,
    from    : null,
    to      : null,

    init: function (fromaddress, toaddress) {
        from        = fromaddress;
        to          = toaddress;
        fromurl     = 'http://example.com/url=' + fromurl;
        tourl       = 'http://example.com/url=' + tourl;

        Route.searchRoute();
    },

    searchRoute: function () {
        console.log(Xml.init(from, to, fromurl)); // <---- this returns undefined why
    }

};

init函数不返回任何内容。这里有一个可行的方法:

var Xml = {
    to      : null,
    from    : null,
    url     : null,
    result  : null,

    init: function (fromaddress, toaddress, link) {
        from    = fromaddress;
        to      = toaddress;
        url     = link;

        this.requestXml();
        return this;
    },

    requestXml: function () {
        $.ajax({
            type: "GET",
            url: url,
            dataType: "xml",
            success: this.parseXml
        });
    },

    parseXml: function (xml) {
            console.log($(xml));
        result = $(xml);
    },

    getResult: function () {
        return result;
    }
};
然后你可以打电话:

searchRoute: function () {
    var xml = Xml.init(from, to, fromurl);
    console.log(xml.getResult());
}
解释

您的代码尝试从ini()方法获取结果,该方法不返回数据。相反,它调用请求函数,该函数异步调用parseXML()——parseXML()返回的结果在任何地方都不会结束。这就是你的代码。和我的有什么不同


在我的代码中,init()确实返回Xml类的实例。有了这个条件,parseXml可以将结果保存在一个变量中(这里是result)。然后,函数getResult()可以返回xml。

init函数不会返回任何内容。这里有一个可行的方法:

var Xml = {
    to      : null,
    from    : null,
    url     : null,
    result  : null,

    init: function (fromaddress, toaddress, link) {
        from    = fromaddress;
        to      = toaddress;
        url     = link;

        this.requestXml();
        return this;
    },

    requestXml: function () {
        $.ajax({
            type: "GET",
            url: url,
            dataType: "xml",
            success: this.parseXml
        });
    },

    parseXml: function (xml) {
            console.log($(xml));
        result = $(xml);
    },

    getResult: function () {
        return result;
    }
};
然后你可以打电话:

searchRoute: function () {
    var xml = Xml.init(from, to, fromurl);
    console.log(xml.getResult());
}
解释

您的代码尝试从ini()方法获取结果,该方法不返回数据。相反,它调用请求函数,该函数异步调用parseXML()——parseXML()返回的结果在任何地方都不会结束。这就是你的代码。和我的有什么不同


在我的代码中,init()确实返回Xml类的实例。有了这个条件,parseXml可以将结果保存在一个变量中(这里是result)。然后,函数getResult()可以返回xml。

由于AJAX调用(异步调用),您的代码不会返回xml。 相反,您可以触发自己的事件并聆听它们

这应该起作用:

 var Route = {
    fromurl : null,
    tourl   : null,
    from    : null,
    to      : null,

    init: function (fromaddress, toaddress) {
        from        = fromaddress;
        to          = toaddress;
        fromurl     = 'http://example.com/url=' + fromurl;
        tourl       = 'http://example.com/url=' + tourl;

        Route.searchRoute();
    },

    searchRoute: function () {
        $(document).unbind('your_event').bind('your_event', function (event, xml) {
           console.log(xml);
        });
        Xml.init(from, to, fromurl);
    }
};

var Xml = {
    to      : null,
    from    : null,
    url     : null,

    init: function (fromaddress, toaddress, link) {
        from    = fromaddress;
        to      = toaddress;
        url     = link;

        this.requestXml();
    },

    requestXml: function () {
        $.ajax({
            type: "GET",
            url: url,
            dataType: "xml",
            success: this.parseXml
        });
    },

    parseXml: function (xml) {
        $(document).trigger('your_event', $(xml));
    }
};

由于AJAX调用(异步调用),您的代码不会返回XML。 相反,您可以触发自己的事件并聆听它们

这应该起作用:

 var Route = {
    fromurl : null,
    tourl   : null,
    from    : null,
    to      : null,

    init: function (fromaddress, toaddress) {
        from        = fromaddress;
        to          = toaddress;
        fromurl     = 'http://example.com/url=' + fromurl;
        tourl       = 'http://example.com/url=' + tourl;

        Route.searchRoute();
    },

    searchRoute: function () {
        $(document).unbind('your_event').bind('your_event', function (event, xml) {
           console.log(xml);
        });
        Xml.init(from, to, fromurl);
    }
};

var Xml = {
    to      : null,
    from    : null,
    url     : null,

    init: function (fromaddress, toaddress, link) {
        from    = fromaddress;
        to      = toaddress;
        url     = link;

        this.requestXml();
    },

    requestXml: function () {
        $.ajax({
            type: "GET",
            url: url,
            dataType: "xml",
            success: this.parseXml
        });
    },

    parseXml: function (xml) {
        $(document).trigger('your_event', $(xml));
    }
};


Xml.init
从不返回任何内容,而且Ajax是异步的。在
parseXml
中处理Xml我会时不时地使用相同的Xml对象,我需要从中获取不同类型的数据。这就是我在route.js中解析它的原因。请问还有其他的解决方案吗?可能重复的是怎么可能重复的?这是另一个主题,它无助于解决此问题。
Xml.init
从不返回任何内容,而且Ajax是异步的。在
parseXml
中处理Xml我将不时使用同一个Xml对象,我需要从中获取不同类型的数据。这就是我在route.js中解析它的原因。请问还有其他的解决方案吗?可能重复的是怎么可能重复的?这是另一个没有帮助解决这个问题的主题;Xml-class中定义了函数getResult。它返回空。你能重新检查你的代码是否正确吗?我必须在某个地方定义getResult()吗?看看我的代码;Xml-class中定义了函数getResult。它返回空。你能重新检查你的代码是否正确吗?我必须在一个文件中添加Xml对象和路由对象吗?这里什么是
your_event
?你不必在一个文件中添加Xml和路由代码。事件名称“your_event”只是一个示例。你可以随意命名。唯一的问题是路由和Xml文件中的事件名称必须相同。我必须在一个文件中添加Xml对象和路由对象吗?这里什么是
您的\u事件
?您不必在一个文件中添加Xml和路由代码。事件名称“your_event”只是一个示例。你可以随意命名。唯一的问题是路由和Xml文件中的事件名称必须相同。