【问题标题】:function inside function not executing [duplicate]函数内部的函数未执行[重复]
【发布时间】:2014-05-09 14:26:32
【问题描述】:

我有一段代码

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

当我运行代码时,它运行良好,除了无需等待代码执行,就好像从来没有超时一样

编辑----更详细的代码。这段代码中有些东西不起作用,因为即使有一个在 500 毫秒和 800 毫秒之间变化的超时设置,也没有延迟,deltas 变量是 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;
    }

【问题讨论】:

  • TLDR : setTimeout(b, 1000*(i+1));
  • 工作正常,等待 5 秒代码被执行。
  • @ProllyGeek - 除非它立即以相同的值执行 10 次。
  • @RobH 这是因为我是在函数执行之前设置的 OP 问题是延迟,不是吗?

标签: javascript


【解决方案1】:

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

你可以使用这个模式来修复它:

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

【讨论】:

  • 好建议,但在代码点的上下文中认为它会起作用
猜你喜欢
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
相关资源
最近更新 更多