1

次のモジュールを実装するために AMD と Requirejs を使用しています。

define({
callWeatherService: function(x, y){

     //var url = 'http://www.webservicex.net/CurrencyConvertor.asmx/ConversionRate?FromCurrency=INR&ToCurrency=AUD'; // website you want to scrape
    var url = 'http://www.webservicex.net/globalweather.asmx/GetWeather?CityName=' + x + '&CountryName=' + y;

    var yql = 'http://query.yahooapis.com/v1/public/yql?q=' + encodeURIComponent('select * from xml where url="' + url + '"') + '&format=json&callback=?';  
    $.getJSON(yql,displayData);

    function displayData(data){  
        if(data.query.results){
            result = data.query.results.string.content.replace(/<script[^>]*>[\s\S]*?<\/script>/gi, '');
            document.getElementById("asmxResult").innerHTML = result;
            // return result;
        }
    }

}

});

このコードで HTML ドキュメントを変更したくはありませんが、結果を返します。stackoverflow で提供されている他のソリューションからのコールバックに対してさまざまな方法を試しましたが、どれも機能していないようです。たとえば、次のコードは結果をコンソールに記録しますが、未定義を返します。

define({


callWeatherService: function(x, y){


    var url = 'http://www.webservicex.net/globalweather.asmx/GetWeather?CityName=' + x + '&CountryName=' + y;

    var yql = 'http://query.yahooapis.com/v1/public/yql?q=' + encodeURIComponent('select * from xml where url="' + url + '"') + '&format=json&callback=?';  

    var result;

    $(function() {
        var r = GetResults();  
        result = r;
    });

    function GetResults() {

        $.getJSON(yql,function(data){  
            if(data.query.results){
                var output = data.query.results.string.content.replace(/<script[^>]*>[\s\S]*?<\/script>/gi, '');
            }
            console.log(output);
            return output;
        });

    }

    return result;

}

});

これは AMD と Requirejs を使用しているためですか、それとも何か間違っていますか?

4

2 に答える 2

0

あなたの問題は、コールバック関数を使用していないことだと思います。

Ajax 呼び出しは非同期であるため、関数 GetResults は何かを返すことができず、コールバック関数内で結果を処理する必要があります。

値を返す代わりに、次のようにする必要があります。

callback(output);

または多分これ

callback(data.query.results.string.content.replace(/<script[^>]*>[\s\S]*?<\/script>/gi, ''));

これで始められるはずです。多くの同様のSO スレッドがあり、Google はさらに一歩進めることができます。

ここで重要なのは、ajax を使用して値を返すことは、最初に表示されるよりもトリッキーであることです。メソッド B から何かを要求するメソッド A が、メソッド A から必要なものを受け取る前に、メソッド A の別の場所に移動した可能性があるため、一部のロジックはデータを返すことができません。方法 B. 幸運を祈ります。

于 2013-08-07T11:05:16.213 に答える