0

私は2つのjsファイルを持っています。1つはroute.js、2つ目はxml.jsです。ファイルで、route.jsにある関数を呼び出していますxml.js。その関数が行うことは、xml リンクを解析して xml オブジェクトを返すことです。xml.jsconsole.log($(xml))内で実行すると xml が表示されますが、このオブジェクトを返してconsole.log(Xml.init(param, param, param))内部で実行route.jsすると が返されますundefined。なぜ?

これが私のコードです

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
    }

};

xml.js

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) {
        console.log($(xml));  //<--- works absolutely fine here
        return $(xml);
    }
};

アップデート

Xmlオブジェクトも次のように変更しました。ここでは、プラグインを使用して文字列に変換xmlしていますが、まだ未定義が返されます。どうすればこの問題を解決できますか?stringjson[xmltojson][1]

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

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

    $.ajax({
        type: "GET",
        url: url,
        dataType: "xml",
        success: function (xml) {
            var xmltostring     = Xml.xmlToString(xml),
            stringtojson    = Xml.stringxmlToJson(xmltostring);
            return stringtojson;
        }
    });
},

xmlToString: function (xmlData) { 
    var xmlString;
    if (window.ActiveXObject) {
        xmlString = xmlData.xml;
    } else {
        xmlString = (new XMLSerializer()).serializeToString(xmlData);
    }
    return xmlString;
},

stringxmlToJson: function (stringxml) {
    return $.xml2json(stringxml);
}
};
4

2 に答える 2

4

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));
    }
};
于 2012-11-08T08:09:14.010 に答える
1

init-function は何も返しません。これを機能させる可能性は次のとおりです。

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() を呼び出す request-function を呼び出します。parseXml() が返す結果はどこにもありません。だから、それはあなたのコードです。私のとの違いは何ですか?

私のコードでは、init() は Xml クラスのインスタンスを返します。これにより、parseXml は結果を変数に保存できます (result here)。関数 getResult() は、xml を返すことができます。

于 2012-11-08T08:06:02.947 に答える