как использовать как тайм-аут, так и перерыв внутри цикла в javascript

#javascript #reactjs

Вопрос:

В соответствии с приведенным ниже временем ожидания кода не работает должным образом, как решить эту проблему.

 for (let i = 0; i lt; 4; i  ) {  if (socket.isConnected() == true) {  connectCall([]);  break;  } else {  setTimeout(() =gt; {  console.log("Call-1:");  }, 1000);  } } 

Здесь setTimeout не работает должным образом каждый раз, когда задерживается на некоторое время. меня беспокоит то, что, когда условие совпадает, прерывается цикл, а не совпадает, затем задерживается на некоторое время.если есть какой-либо другой способ сделать это, пожалуйста, пришлите мне правильное решение. если это сделано из цикла while или любого другого цикла, то это также принимается.

Ответ №1:

setTimeout работает правильно, это задерживает выполнение console.log на 1 секунду, но это происходит асинхронно.

Как вы можете видеть в этом примере, все журналы происходят непосредственно через 1 секунду:

 for(let i = 0; i lt; 4; i  ) {  setTimeout(() =gt; {  console.log(i);  }, 1000); } 

Если вы хотите «поспать» в течение одной секунды в своем цикле, вам нужно подождать setTimout .

Вы можете сделать это Promise , например, с помощью:

 (async () =gt; {  const socket = {  isConnected: () =gt; false  }   for (let i = 0; i lt; 4; i  ) {  if (socket.isConnected()) {  connectCall([]);  break;  } else {  await new Promise(res =gt; {  setTimeout(() =gt; {  console.log(`Call-${i}:`);  res();  }, 1000);  });  }  } })();