它们可用时返回json回调数据?

时间:2013-08-07 10:45:20

标签: jquery callback requirejs amd

我使用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中提供的其他解决方案进行回调,但似乎都没有。例如以下代码在控制台上记录结果,但返回undefined:

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

2 个答案:

答案 0 :(得分: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;
    }

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

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

答案 1 :(得分:0)

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

Ajax调用是异步的,因此GetResults函数无法返回某些内容,您必须在回调函数内处理结果。

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

callback(output);

或者这个

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

这应该让你开始,有很多similar个SO线程,Google可以让你更进一步。

这里重要的是,使用ajax返回值比首次出现时更复杂,某些逻辑无法返回数据,因为需要方法B某些内容的方法A可能会在接收到之前移到方法A中的另一个位置它需要方法B.祝你好运。