函数内部函数未执行

时间:2014-05-09 14:26:32

标签: javascript

我有一段代码

function a() {
  for(var i = 0; i<10;i++) {
    function b() {
      //do something
    }
  setTimeout(b, 1000);
  }
}

当我运行代码时,它运行正常,除了没有等待代码执行,好像从来没有任何超时

编辑----更详细的代码。有些东西在这段代码中没有用,因为即使有超时设置在500毫秒到800毫秒之间也没有延迟,增量变量是8

function dataServer() {
          $.getJSON("/service/data/message", function(data) {
                if(data) {
                    msgs = data;
                            check = true;
                            counter = 0;
                            var total = data.length;
                            waitTime = (60000 / total) - (8 * delay);
                            for(var message in data) {
                                var latLng = new google.maps.LatLng(-54.75, 148);
                                var marker = new google.maps.Marker({
                                                                    position: latLng,
                                                                    map: map,
                                                                    optimized: true,
                                                                    icon: new google.maps.MarkerImage( image , undefined, undefined, undefined, new google.maps.Size(85, 60))
                                                                    });
                                position = [-55, 148];
                                result = [ data[message].x, data[message].y ];
                                i = 0;
                                deltaLat = (result[0] - position[0])/numDeltas;
                                deltaLng = (result[1] - position[1])/numDeltas;
                                var w = 85;
                                var h = 60;
                                var shrinkW = w / 2;
                                var shrinkH = h /2;
                                var shrinkDeltaW = shrinkW / numDeltas;
                                var shrinkDeltaH = shrinkH / numDeltas;
                                var deltaW = w / numDeltas;
                                var deltaH = h / numDeltas;
                                var toSet = true;

                                function moveMarker(result){
                                    position[0] += deltaLat;
                                    position[1] += deltaLng;

                                    if(i % 4 == 0) {                    
                                        w -= deltaW;
                                        h -= deltaH;
                                    }

                                    var latlng = new google.maps.LatLng(position[0], position[1]);
                                    marker.setPosition(latlng);
                                    marker.setIcon(new google.maps.MarkerImage( image , undefined, undefined, undefined, new google.maps.Size(w, h)));

                                    if(i == (numDeltas - 1)) {
                                        var latlng = new google.maps.LatLng(data[message].x, data[message].y);
                                        marker.setPosition(latlng);
                                        i++;
                                    }

                                    if(i!=numDeltas){
                                        i++;
                                        if(markerArray.length > 10) {
                                            shrinkW -= shrinkDeltaW;
                                            shrinkH -= shrinkDeltaH;
                                            markerArray[0].setIcon(new google.maps.MarkerImage( image , undefined, undefined, undefined, new google.maps.Size(shrinkW, shrinkH)));
                                            if(i == (numDeltas -1)) {
                                                markerArray[0].setIcon(new google.maps.MarkerImage( image , undefined, undefined, undefined, new google.maps.Size(85, 60)));
                                                markerArray[0].setMap(null);
                                                markerArray.splice(markerArray[0], 1);
                                                feature = map.data.getFeatureById(dataArray[0].countryCode);
                                                if (feature) {
                                                    feature.setProperty('colour', dataArray[0].opacity);
                                                } else {
                                                }
                                                dataArray.splice(dataArray[0], 1);
                                            }

                                        }
                                        //delay = waitTime / 8;
                                        setTimeout(moveMarker, waitTime);
                                    } 

                                }

                                moveMarker(result);

                                markerArray.push(marker);
                                dataArray.push(data[message]);

                                //if(stop) { break; }
                            }


                } else {


                    dataServer();
                }


          }); 

        if(check == false) {
            counter++;
            if(counter == 100) {
                window.location.href = "/intermission.htm";
            }   
        }

        check = false;
    }

1 个答案:

答案 0 :(得分:0)

这里的主要问题是i在超时之前在b的闭包中被修改。这意味着将使用i = 10执行10次超时。

您可以使用此模式来修复它:

function a() {
    for(var i = 0 ; i < 10 ; i++) {
        (function(i) {
            function b() {
                //do something
            }
            setTimeout(b, 1000);
        })(i);
    }
}