从内部有数据库查询的javascript函数返回对象

时间:2015-06-23 17:00:17

标签: javascript

我试图将标记作为对象返回,但是当我运行该函数时它只返回[],但是在里面打印我可以看到对象数据,有人可以解释如何返回对象batch2吗?

google.maps.event.addListener(mgr, 'loaded', function(){
            mgr.addMarkers(getMarkers(),6); //add all the markers! documentation for viewports with totals for city count, look at viewport
            mgr.addMarkers(getMarkers2(),14); //get markers for zoomed out place, add click function to zoom in
            //mgr.addMarkers(getMarkers(1000), 8);
            console.log("added");
            mgr.refresh();
        });

function getMarkers2() {

        var batch2 = [];
        var clusters = new Parse.Query("cityfreqcoords");
        var clusterresults = new Parse.Object("cityfreqcoords");

        clusters.find({
            success: function (results) {
                for (i = 1; i < results.length; i++) {

                    var city = (results[i]["attributes"]["city"]);
                    var count = (results[i]["attributes"]["count"]);

                    var lat = (results[i]["attributes"]["lat"]);
                    var lng = (results[i]["attributes"]["lng"]);

                    var markerLatlong = new google.maps.LatLng(lat, lng);

                    //icon =

                    //adding the marker
                    var marker2 = new google.maps.Marker({
                        position: markerLatlong,
                        title: city,
                        clickable: true,
                        animation: google.maps.Animation.DROP
                        //icon:icon
                    });

                    //adding the click event and info window
                    google.maps.event.addListener(marker2, 'click', function () {
                        map.setZoom(6);
                        map.setCenter(marker2.getPosition());
                    });
                    batch2.push(marker2);
                }
            }
        })
        return batch2;
    }

3 个答案:

答案 0 :(得分:4)

clusters.find似乎是异步的。在batch2成功之前返回cluster.find。在JavaScript中使用异步代码有一些模式 - 一种常见的方法是使用回调。您需要像这样重写代码:

function getMarkers2(callback) {

    var batch2 = [];
    var clusters = new Parse.Query("cityfreqcoords");
    var clusterresults = new Parse.Object("cityfreqcoords");

    clusters.find({
        success: function (results) {
            for (i = 1; i < results.length; i++) {

                var city = (results[i]["attributes"]["city"]);
                var count = (results[i]["attributes"]["count"]);

                var lat = (results[i]["attributes"]["lat"]);
                var lng = (results[i]["attributes"]["lng"]);

                var markerLatlong = new google.maps.LatLng(lat, lng);

                //icon =

                //adding the marker
                var marker2 = new google.maps.Marker({
                    position: markerLatlong,
                    title: city,
                    clickable: true,
                    animation: google.maps.Animation.DROP
                    //icon:icon
                });

                //adding the click event and info window
                google.maps.event.addListener(marker2, 'click', function () {
                    map.setZoom(6);
                    map.setCenter(marker2.getPosition());
                });
                batch2.push(marker2);
            }
        }

        callback(batch2);
    })
}

然后这样称呼它:

getMarkers2(function(markers) {
  mgr.addMarkers(markers, 14);
});

如果您有兴趣,请查看承诺的工作方式,因为您可能更喜欢使用回调方式。

答案 1 :(得分:0)

使用javascript中的回调,您通常不会返回数据。您将另一个函数引用传递到处理程序作为回调。

EG:

function getMarkers2(f) { 
    // do stuff
    //when done
    f(batch2)
}

答案 2 :(得分:0)

结束只是通过使标记管理器全局并将mgr传递给有效的查询,可能不是最有效的方法

function getMarkers2(mgr) {

        Parse.initialize("X", "Y");

        var batch2 = [];
        var clusters = new Parse.Query("cityfrequency2");
        var clusterresults = new Parse.Object("cityfrequency2");

        clusters.find({
            success: function (results) {
                for (i = 0; i < (results.length); i++) {

                    var city = (results[i]["attributes"]["city"]);

                    var lat = (results[i]["attributes"]["lat"]);
                    var lng = (results[i]["attributes"]["lng"]);

                    var markerLatlong = new google.maps.LatLng(lat, lng);

                    var image = {
                        url: 'warning.png',
                        size: new google.maps.Size(50, 46),
                        // The origin 
                        origin: new google.maps.Point(0, 0),
                        // The anchor 
                        anchor: new google.maps.Point(25, 0)
                    };

                    //adding the marker
                    var marker2 = new google.maps.Marker({
                        position: markerLatlong,
                        title: city,
                        clickable: true,
                        animation: google.maps.Animation.DROP,
                        icon:image
                    });

                    //adding the click event and info window
                    google.maps.event.addListener(marker2, 'click', function () {
                        map.setZoom(6);
                        map.setCenter();
                    });
                    batch2.push(marker2);
                    mgr.addMarkers(batch2,0,6);
                    mgr.refresh();
                }
            }
        })
    }

    function setupMarkers() {
        var mgrOptions = { borderPadding: 50, maxZoom: 15, trackMarkers: true };
        mgr = new MarkerManager(map,mgrOptions);

        google.maps.event.addListener(mgr, 'loaded', function(){

            getMarkers2(mgr);
            getMarkers(mgr);

            console.log("added");
        });
    }