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

好的,您的第一个问题是返回输出位于错误的位置,因此将其移至此处:

    function GetResults() {

        var output;

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

其次,我可能不会这样做,我会创建一个函数来处理回调,而不是像这样使用匿名回调:

    $.getJSON(yql,myFuncToDoSomething(data));

    function myFuncToDoSomething(data){
        if(data.query.results){
            var output = data.query.results.string.content.replace(/<script[^>]*>[\s\S]*?<\/script>/gi, '');
        }
        console.log(output); //or do something else
    }

毕竟它是事件驱动的:D希望这会有所帮助。

于 2013-08-07T11:00:14.270 回答
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 回答