Javascript 使用setTimeout更新变量和运行函数

Javascript 使用setTimeout更新变量和运行函数,javascript,jquery,Javascript,Jquery,我正试图每隔1/2秒向无人机发送一组新的坐标。现在,它没有按我计划的方式工作(也就是说它根本不工作)。在.js文件中,我有90个不同的Lat、Long和Alt坐标。他们的名单如下: setTimeout(function () {long_in=-74.61122515230907;lat_in=41.05861743700108;alt_in=10}, 5000); setTimeout(function () {long_in=-74.61124258212661;lat_in=41.058

我正试图每隔1/2秒向无人机发送一组新的坐标。现在,它没有按我计划的方式工作(也就是说它根本不工作)。在.js文件中,我有90个不同的Lat、Long和Alt坐标。他们的名单如下:

setTimeout(function () {long_in=-74.61122515230907;lat_in=41.05861743700108;alt_in=10}, 5000);
setTimeout(function () {long_in=-74.61124258212661;lat_in=41.05864962647036;alt_in=10}, 10000);
setTimeout(function () {long_in=-74.61125021662482;lat_in=41.05867214783328;alt_in=10}, 15000);
等等

然后他们需要通过这个函数-

if (coordinate == "GPS") {
    console.log("GPS go");
    lat_out = lat_in;
    long_out = long_in;
    alt_out = alt_in;
    console.log(lat_out, long_out, alt_out)
}
最后它将把这个命令发送给无人机-

var msgdata = {};
msgdata["twist"] = {};
msgdata.twist["twist"] = {};
msgdata.twist.twist["linear"] = {};
msgdata.twist.twist.linear["x"] = lat_out;
msgdata.twist.twist.linear["y"] = long_out;
msgdata.twist.twist.linear["z"] = alt_out;
msgdata.twist.twist["angular"] = {};
msgdata.twist.twist.angular["z"] = 1.00;
msgdata["tolerance"] = 2.00;
msgdata["async"] = true;
msgdata["relative"] = false;
msgdata["yaw_valid"] = true;
msgdata["body_frame"] = false;

$.ajax({
    type: "POST",
    dataType: "json",
    data: JSON.stringify(msgdata),
    url: "http://" + ip + "/ros/" + namespace + "/navigation/position_set",
    success: function (data) {
        console.log(data, "Coordinates sent", lat_out,long_out,alt_out);
    }
});

在此代码之前,我已经全局定义了所有变量。所有的命令都工作得很好,我只是不能让它们每1/2秒刷新一次。我是否需要在每个
setTimeout
或其他内容中包含所有这些命令?谢谢您的帮助。

设置值后,您必须在
设置超时内运行重新计算。

是的,您需要反复拨打电话。您可以将其包装在函数中,并通过
setTimeout
反复调用

根据@Liam的建议和评论讨论,我创建了一个回调链来保证执行顺序

setTimeout(function() {
  long_in = -74.61122515230907;
  lat_in = 41.05861743700108;
  alt_in = 10;
  prepSignal(long_in, lat_in, alt_in, function() {
    setTimeout(function() {
      long_in = -74.61124258212661;
      lat_in = 41.05864962647036;
      alt_in = 10;
      prepSignal(long_in, lat_in, alt_in, function() {
        setTimeout(function() {
          long_in = -74.61125021662482;
          lat_in = 41.05867214783328;
          alt_in = 10;
          prepSignal(long_in, lat_in, alt_in);
        }, 5000);
      });
    }, 5000);
  });
}, 5000);


var coordinate = "GPS";

function prepSignal(long_in, lat_in, alt_in, callback) {
  if (coordinate == "GPS") {
    console.log("GPS go");
    lat_out = lat_in;
    long_out = long_in;
    alt_out = alt_in;
    console.log(lat_out, long_out, alt_out, callback);
    sendSignal(long_in, lat_in, alt_in, callback);

  }

  function sendSignal(long_in, lat_in, alt_in, cb) {
    var msgdata = {};
    msgdata["twist"] = {};
    msgdata.twist["twist"] = {};
    msgdata.twist.twist["linear"] = {};
    msgdata.twist.twist.linear["x"] = lat_out;
    msgdata.twist.twist.linear["y"] = long_out;
    msgdata.twist.twist.linear["z"] = alt_out;
    msgdata.twist.twist["angular"] = {};
    msgdata.twist.twist.angular["z"] = 1.00;
    msgdata["tolerance"] = 2.00;
    msgdata["async"] = true;
    msgdata["relative"] = false;
    msgdata["yaw_valid"] = true;
    msgdata["body_frame"] = false;

    $.ajax({
      type: "POST",
      dataType: "json",
      data: JSON.stringify(msgdata),
      url: "http://" + ip + "/ros/" + namespace + "/navigation/position_set",
      success: function(data) {
        console.log(data, "Coordinates sent", lat_out, long_out, alt_out);
      if(cb && typeof cb == "function") {
          cb();
      }

      }
    });
  }
}

setTimeout不保证在x的时间内运行。实际执行时间可以也将根据其他情况而变化。记住JS是()单线程的这段代码的计时并不需要精确,问题是刷新函数如果你想让它们依次运行,最好使用回调函数,然后设置一个静态量的超时。我知道你说过不需要精确,但如果你控制无人机,那肯定不是真的?确切的顺序可能不会被保留,因此它可以运行a->c->b,而不是a->b->c。然后你在一个完全不同的地方,你以为你是好的,我知道你从这里来。是否认为最好执行
setInterval
?不,他的意思是使用回调链来确保每个请求在前一个操作完成后启动,比如说
5000ms
。因此,即使这个
5000ms
不准确,您也可以保证订单得到保留。您这么说吗?我在ajax仪式的Success func中调用了它,@awesome有点错过了它。你还需要检查空值,因为最后一个prepsignal没有发送回拨。我知道,有麻烦了,因为我只是在整个过程中添加了一个accross。即使是失败的案例也没有考虑在内。由于担心过于苛刻,promise and then()会更干净,但这几乎涵盖了它