setTimeout 没有被解雇

setTimeout not being fired

我正在使用 Leaflet 在平面图上添加 3 个标记。它工作正常。然后我试着让 Math.random 每 3 秒生成一次以像素为单位的坐标,删除旧标记并添加一个新标记。但我发现 setTimeout() 不起作用。我尝试了很多解决方案,都失败了。请问可以指导一下吗?

还有一个问题:control.scale 也不起作用。比例尺还在左下角,英尺栏还在。

我正在使用 Leaflet 在平面图上添加 3 个标记。它工作正常。然后我试着让 Math.random 每 3 秒生成一次以像素为单位的坐标,删除旧标记并添加一个新标记。但我发现 setTimeout() 不起作用。我尝试了很多解决方案,都失败了。请问可以指导一下吗?

还有一个问题:control.scale 也不起作用。比例尺还在左下角,英尺栏还在。

  <script>

    var map = L.map('map', {
    crs: L.CRS.Simple,
    Zoom: 0,
    maxZoom:16,
    minZoom: -5
  });



    var bounds = [[0,0], [1079,2159]];  // [y, x]
    var image = L.imageOverlay('officemap.jpeg', bounds).addTo(map);

    map.setView( [539,1075], 0);   // ([y , x] , zoom)

    map.fitBounds(bounds);

    //L.control.scale('topleft', '50', 'True', 'False', 'True' ).addTo(map); // doesn't work !!!

    L.control.scale().addTo(map);


    var yx = L.latLng;

    var xy = function(x, y) {
      if (L.Util.isArray(x)) {    // When doing xy([x, y]);
          return yx(x[1], x[0]);
    }
    return yx(y, x);  // When doing xy(x, y);
  };

  function getRandomIntInclusive(min, max) {
    min = Math.ceil(min);
    max = Math.floor(max);
    return Math.floor(Math.random() * (max - min + 1)) + min;  
  }

  var sol      = xy(1079, 539);
  //var mizar    = xy(2159, 1079);
  //var mizar    = xy(getRandomIntInclusive(0, 2159), getRandomIntInclusive(0, 1079));
  var kruegerZ = xy(0,  0);

  var maker_text="I am good!!!";

  //var maker_text_array =['Name:', 'Age:', 'Group:'];

  L.marker(sol).addTo(map).bindTooltip(      'Sol');


  L.marker(kruegerZ).addTo(map).bindTooltip(maker_text);

  //var previous_maker=null;
  var current_marker=null;

  /*
  function sleep(milliseconds) {
      const date = Date.now();
      let currentDate = null;
      do {
       currentDate = Date.now();
        } while (currentDate - date < milliseconds);
     };

*/ 
  var i="100"; 
  var mizar    = xy(getRandomIntInclusive(0, 2159), getRandomIntInclusive(0, 1079));
  current_marker=L.marker(mizar).addTo(map).bindTooltip(i);


function del_add(){

  alter("in set");
  map.removeLayer(current_marker);
  mizar= xy(getRandomIntInclusive(0, 2159), getRandomIntInclusive(0, 1079));
  current_marker=L.marker(mizar).addTo(map).bindTooltip("I am OK");
};

//for(var j=0; j<10; j++){

  setTimeout("del_add()", 100);


//};
//alert("done");
//  var travel = L.polyline([sol, deneb]).addTo(map);




</script>

改变

setTimeout("del_add()", 100);

setTimeout(del_add, 100);

首先setTimetout有两个参数,第一个 is function(不是字符串在你的例子中)和第二个 时间毫秒.

如果您只是删除引号,它会立即触发该功能。这相当于:

setTimetou(det_all(), 100);
// Equivalent to:   
const foo = det_all();
setTimetou(foo, 100);

如果你去掉圆括号你会得到等价于这个

setTimetou(det_all, 100);   
// Equivalent to:
setTimeout(() => det_all(), 100);

这就是您所需要的!

正如我所说,setTimeout 需要函数。如果你写 foo() 你立即调用函数并结合 setTimeout(foo()) 你将函数的结果传递给 setTimetou 而不是函数本身