Javascript: Как я могу сделать синхронный цикл? - PullRequest
0 голосов
/ 21 ноября 2018

Меня смущает синхронная / асинхронная обработка JavaScript.

Что я хочу сделать, это ниже.Когда вызывается self_driving(), вызывается get_direction_by_sensor() и, используя направление, двигатель начинает работать с move_to_direction(direction).Этот процесс повторяется 5 раз.

function get_direction_by_sensor(){
  // code for getting direction from sensor
  return direction
};

function move_to_direction(direction){
  direction = get_direction_by_sensor()
  // code for driving motor to the direction
};

function self_driving_loop(maxCount, i) {
  if (i <= maxCount) {
    move_to_direction();
    setTimeout(function(){
      self_driving_loop(maxCount, ++i)
    }, 1000);
  }
};

function self_driving() {
  self_driving_loop(5, 1)
};

Итак, я хочу, чтобы этот код работал следующим образом.

1. get_direction_by_sensor()
1. move_to_direction()
2. get_direction_by_sensor()
2. move_to_direction()
3. get_direction_by_sensor()
3. move_to_direction()
4. get_direction_by_sensor()
4. move_to_direction()
5. get_direction_by_sensor()
5. move_to_direction()

Но на самом деле он работает следующим образом.

1. get_direction_by_sensor()
2. get_direction_by_sensor()
3. get_direction_by_sensor()
4. get_direction_by_sensor()
5. get_direction_by_sensor() // this direction is used for moving
5. move_to_direction()

Как я могу исправить этот код?Спасибо.

======== ПОДРОБНАЯ ИНФОРМАЦИЯ ========

move_to_direction() calles Макрос webiopi, написанный Python.

function move_to_direction() {
  w().callMacro('get_direction_to_move', [TRIG_F ,ECHO_F ,TRIG_R ,ECHO_R ,TRIG_L ,ECHO_L ,TRIG_B ,ECHO_B], function(macro, args, resp) {
    console.log(resp) // DEBUG
    if(resp == "forward") {
      change_direction('FOWARD');
    } else if(resp == "right") {
      change_direction('RIGHT');
    } else if(resp == "left") {
      change_direction('LEFT');
    } else if(resp == "backward") {
      change_direction('BACKWARD');
    }
  });
}

1 Ответ

0 голосов
/ 21 ноября 2018

settimeout должен быть заключен в обещание, чтобы его можно было ожидать.см

function self_driving_loop(maxCount, i) {
  return new Promise(resolve => {
    if (i <= maxCount) {
       move_to_direction();
       setTimeout(function(){
         self_driving_loop(maxCount, ++i)
         resolve()
       }, 1000);
    }
  })
};

называйте это так в асинхронной функции

await self_driving_loop(maxCount, i)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...