0

私は困惑しています。JSON オブジェクトがコールバック関数によって解析されない理由がわかりません。コンソール ログに次のエラーが表示されます。

TypeError: data is undefined for (var i = 0, len = data.features.length; i < len; i++) {

あなたの助けは大歓迎です!

ajax コード:

$.ajax({
        type : 'POST',
        url  : 'timezone.php',
        dataType : 'json',
        data     : { "func" : "getFirstAndNext", epochTime : browserUTC },
        success  : function( data ) {
                console.log( data.first );
                console.log( data.next );
                sector_callback( data.first );

            // do something with data.myObject.memberVariable

        },
        error : function ( XMLHttpRequest, textStatus, errorThrown ) {
            // didn't work!
        }
    });

PHP スクリプト:

    <?php
    //header('Content-Type: application/json; charset=utf-8');
    function getFileStamp($type) {
        $timeInterval = 15; // minutes
        $now = round($_POST['epochTime'] / 1000);
        $now = round(1352324181061 /1000 ); // 3:36:21
        //$now = round(1352238011.067);
        $offsetInSeconds = $timeInterval * 60;
        $offsetInMillis  = $timeInterval * 60 * 1000;

        $currentFileTime = $now - $now % ($timeInterval * 60);
        //$currentFileTime = ($now - ($now  % $offsetInMillis))/1000.0;  // this returns epoch time in $timeInterval minutes.
        $nextFileTime = $currentFileTime + $offsetInSeconds;  // next epoch time for file;
        return ($type == 0) ? $currentFileTime : $nextFileTime;
    }

        $currentFileTime = getFileStamp(0) . '.json';
        $nextFileTime = getFileStamp(1) . '.json';

        $res = array();
        $res['file1'] = file_get_contents($currentFileTime);
        $res['file2'] = file_get_contents($nextFileTime);
        echo json_encode(array("first"=>$res['file1'],"next"=>$res['file1'])); //takes contents and converts it to json object
    ?>

セクター コールバック関数:

    var allPolygons = [];
    function sector_callback() {
        //console.log(data);
        var bounds = new google.maps.LatLngBounds();        
        for (var i = 0, len = data.features.length; i < len; i++) {
            var coords = data.features[i].geometry.coordinates[0];
            siteNames = data.features[i].properties.Name; // added for site names
            var path = [];
        for ( var j = 0, len2 = coords.length; j < len2; j++ ){ // pull out each     set of coords and create a map object
            var pt = new google.maps.LatLng(coords[j][1], coords[j][0])
            bounds.extend(pt);
            path.push(pt);

        }

        var polygons = new google.maps.Polygon({
        path: path,
            strokeColor: "#000000",
            strokeOpacity: 0.8,
            strokeWeight: 1,
            fillColor: "#000000",
            fillOpacity: 0.35,
        map: map
        });
        createClickablePoly(polygons, siteNames);

        google.maps.event.addListener(polygons, 'mouseover', function() {
        var currentPolygon = this;

        currentPolygon.setOptions({ 
            fillOpacity: 0.45,
            fillColor: "#FF0000"
            })
        });

        google.maps.event.addListener(polygons, 'mouseout', function() {
        var currentPolygon = this;
        currentPolygon.setOptions({ 
            fillOpacity: 0.35,
            fillColor: "#000000"
            })
        });

        allPolygons.push(polygons);
        }
    }
4

1 に答える 1

1

ここで確認できることだけを見てみると、とにかく、sector_callback()がデータにアクセスする方法がわかりません。jQueryがデータを渡すとき、他のすべてがうまくいけば、コンソールはそれらのプロパティを問題なくログに記録するはずです。しかし、そのデータの一部をsector_callback()に渡すと、データが失われます。その理由は、sector_callback()がarguments []配列を読み取って取得するか、関数のシグネチャをsector_callback(data)に変更する必要があるためです。

jQueryブロックで、data.featuresではなくデータを渡します。

sector_callback( data );

そして、独自のコールバック署名を変更します。

function sector_callback(data) {
    console.log(data); // will log the whole chunk of the server data returned

 ...

}

これは、jQueryコールバックに戻ったときにデータがクロージャにあるためです。そのクロージャの外側のどこかで宣言した場合でも、ローカルスコープを保持し、明示的に渡さない限り、他の関数からアクセスすることはできません。

ここで問題の核心を理解し、これが役に立ったことを願っています...

于 2012-11-08T17:53:24.000 に答える