【问题标题】:Return json callback data when they are available?可用时返回 json 回调数据?
【发布时间】:2013-08-07 10:45:19
【问题描述】:

我正在使用 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 还是我做错了什么?

【问题讨论】:

    标签: jquery callback requirejs amd


    【解决方案1】:

    我认为你的问题是你没有使用回调函数。

    Ajax 调用是异步的,所以 GetResults 函数不能返回任何东西,你必须在回调函数内部处理结果。

    您必须执行以下操作,而不是返回值:

    callback(output);
    

    或者这个

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

    这应该可以帮助您入门,周围有很多 similar SO 线程,Google 可以让您更进一步。

    这里重要的是,使用 ajax 返回值比最初看起来更棘手,一些逻辑无法返回数据,因为方法 A 需要方法 B 中的某些内容,可能在它接收到内容之前已移动到方法 A 中的另一个位置它需要方法 B。祝你好运。

    【讨论】:

    • 假期回来了,所以回复晚了在带有警报或写入适当 html 元素的回调方法中。我可以做这个。问题是我需要使用从其他信息模块检索数据的主 javascript 模块中的值。是否可以返回值?
    【解决方案2】:

    好的,你的第一个问题是返回输出在错误的位置,所以把它移到这里:

        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 希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-22
      • 2017-04-15
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多