如何将函数A的返回对象作为参数传递给函数B?

时间:2013-07-14 05:24:48

标签: javascript

我希望以参数的形式将function getCoordinates的返回对象文字(经度和纬度坐标)传递给function getWeather,以便我能够访问function getCoordinates' function getWeather中的对象文字。或者换句话说,我希望将一个函数的输出作为输入传递给另一个函数,以便我能够访问它的数据。我将如何完成这项工作?

到目前为止,这是我的JavaScript代码:

var APP = {
    getCoordinates: function () {
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(function (position) {
                var coordinates = {
                    latitude: position.coords.latitude,
                    longitude: position.coords.longitude
                }
                return coordinates;
            });
        } else {
            console.log("Geolocation isn't supported in your browser.");
        }
    },

    getWeather: function (getCoordinates) {
        var api_key = '1234567890',
            weather_query = 'http://api.wunderground.com/api/';
            weather_query += api_key + '/geolookup/q/';
            weather_query += longitude + ',' + latitude + '.json';
    }
}

6 个答案:

答案 0 :(得分:2)

var APP = {
    getCoordinates: function () {
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(this.getWeather);
        } else {
            console.log("Geolocation isn't supported in your browser.");
        }
    },
    getWeather: function (position) {
        var latitude       = position.coords.latitude,
            longitude      = position.coords.longitude,
            api_key        = '1234567890',
            weather_query  = 'http://api.wunderground.com/api/';
            weather_query += api_key + '/geolookup/q/';
            weather_query += longitude + ',' + latitude + '.json';

        // do weather lookup here, inside success handler of
        // the geolocation call
    }
}

APP.getCoordinates();

FIDDLE

答案 1 :(得分:1)

只有return坐标不会做任何事情。您必须接受回调参数:

var APP = {
    // Get the coordinates, and then do something with them
    getCoordinates: function (callback) {
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(function (position) {
                var coordinates = {
                    latitude: position.coords.latitude,
                    longitude: position.coords.longitude
                }
                // Coordinates are ready, pass to the processing function
                callback(coordinates);
            });
        } else {
            console.log("Geolocation isn't supported in your browser.");
        }
    },

    getWeather: function (coordinates) {
        var api_key = '1234567890',
            weather_query = 'http://api.wunderground.com/api/';
            weather_query += api_key + '/geolookup/q/';
            weather_query += coordinates.longitude + ',' + coordinates.latitude + '.json';
    }
}

APP.getCoordinates(APP.getWeather);

答案 2 :(得分:1)

你要做的事是不可能的。所以你需要重新思考它。请注意navigator.geolocation.getCurrentPosition()采用回调函数。这意味着,正如@JonathanLonowski指出的那样,该函数是异步。也就是说,只要传递给它的值变得可用,就会在稍后的时间调用回调函数。

从此回调中返回一个值没有任何好处。你需要做的是在回调中执行任何必要的操作,或者在回调调用的另一个函数中执行(基本上是相同的)。

什么代码调用getWeather()?这是您需要查看的代码。应该在getCurrentPosition()回调中进行调用,而不是仅仅在weather_query回调进行调用,而不应该对getWeather()执行任何操作。

正如代码现在所处,coordinates实际上并没有任何事情。它会创建一些局部变量,然后将其丢弃。所以这可能是下一个需要考虑的问题。

无论你做什么,底线都是一样的:任何依赖getCurrentPosition()回调{{1}}的动作都需要在回调被调用时进行。

正如@adeneo所提到的,有一些工具,比如jQuery的承诺,你可以用来帮助编写更干净的代码来完成这项工作。但是,没有任何工具可以改变基本问题:你必须等到数据准备就绪,这种方式将直接或间接地从该回调中采取行动。

答案 3 :(得分:1)

Adeneo有一个很好的答案。只是为了补充它:

让我们更改getCoordinates,以便它现在需要一个可以对位置数据执行任何处理的回调。

getCoordinates: function (callback) {
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(callback);
        } else {
            console.log("Geolocation isn't supported in your browser.");
        }
    },

现在,getWeather所要做的就是提供回调函数。

getWeather: function () {
        var callback = function(position){
            var coordinates = {
                    latitude: position.coords.latitude,
                    longitude: position.coords.longitude
             };
            var api_key = '1234567890',
            weather_query = 'http://api.wunderground.com/api/';
            weather_query += api_key + '/geolookup/q/';
            weather_query += coordinates.longitude + ',' + coordinates.latitude + '.json';
            console.log(weather_query);
        };
        APP.getCoordinates(callback);

    }

您可以继续使用APP.getWeather来获取数据。此模式可以扩展到您需要处理位置数据的任何其他类型的处理。

答案 4 :(得分:0)

为什么不这样?查看功能getWeather()中的更改。

var APP = {
    getCoordinates: function () {
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(function (position) {
                var coordinates = {
                    latitude: position.coords.latitude,
                    longitude: position.coords.longitude
                }
                return coordinates;
            });
        } else {
            console.log("Geolocation isn't supported in your browser.");
        }
    },

    getWeather: function (coordinates) {
        var api_key = '1234567890',
            weather_query = 'http://api.wunderground.com/api/';
            weather_query += api_key + '/geolookup/q/';
            weather_query += coordinates.longitude + ',' + coordinates.latitude + '.json';
    }
}

// function call:

APP.getWeather(APP.getCoordinates());

答案 5 :(得分:0)

你可以使用回调函数来完成,比如

var APP = {
    getCoordinates: function (cb) {
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(cb);
        } else {
            console.log("Geolocation isn't supported in your browser.");
        }
    },

    getWeather: function () {
        this.getCoordinates(function(cord){
            var api_key = '1234567890',
            weather_query = 'http://api.wunderground.com/api/';
            weather_query += api_key + '/geolookup/q/';
            weather_query += cord.longitude + ',' + cord.latitude + '.json';

            // now you have it
            console.log(weather_query);
        });
    }
}
APP.getWeather();

DEMO.