Вопрос по javascript – Как мне написать блокирующий синхронный метод в Javascript?

7

Я пытаюсь смоделировать метод, который занимает много времени для целей тестирования, но не могу найти хороший способ сделать это в Javascript. Есть ли хорошие подходы, кроме написания очень длинного цикла?

В Firefox вы можете использоватьtrampolining сделать асинхронные вызовы JavaScript синхронными. Aadit M Shah
Ничего плохого, просто хотелось бы сделать что-то вродеsleep(milliseconds), Труднее понять, насколько большим должен быть цикл, но ничто методом проб и ошибок не может быть исправлено. Abdullah Jibaly
как насчет этого:alexeypetrushin.github.io/synchronize/docs/index.html Alexander Mills
Я ищу это, чтобы я мог заменить функцию alert () без необходимости переписывать все наши оповещения как асинхронные, поэтому у функции sleep определенно есть сценарий использования. 100% -ная петля ядра процессора не пройдет хорошо. Async / Await может работать с минимальным изменением кода, но не все браузеры пока поддерживают шаблон асинхронности. Brain2000
что не так с очень длинной петлей? или цикл, который проверяет время? Joseph

Ваш Ответ

3   ответа
3

Вы можете сделать синхронный AJAX-вызов на сервер, который откладывает ответ на некоторое время, как того требует ваш скрипт. Однако обратите внимание, что этот метод не будет работать в Firefox, поскольку он не поддерживает синхронные вызовы AJAX.

Просто используйте эту простую функцию на стороне клиента:

function sleep(microseconds) {
    var request = new XMLHttpRequest;
    request.open("GET", "/sleep.php?time=" + milliseconds);
    request.send();
}

Код дляsleep.php на стороне сервера:

usleep(intval($_GET("sleep")));

Теперь вы можете создавать блокирующие синхронные функции в JavaScript (за исключением Firefox) следующим образом:

alert("Hello");
sleep(1000000); // sleep for 1 second
alert("World");
Error: User Rate Limit Exceeded Abdullah Jibaly
Error: User Rate Limit Exceeded
8

Как насчетцикл, который проверяет время?

function sleep(milliSeconds){
    var startTime = new Date().getTime();                    // get the current time
    while (new Date().getTime() < startTime + milliSeconds); // hog cpu until time's up
}
Error: User Rate Limit Exceeded Abdullah Jibaly
Error: User Rate Limit Exceeded Abdullah Jibaly
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
2

Если вы можете использовать более новый синтаксис await / await:

function sleep (time) {
  return new Promise((resolve) => setTimeout(resolve, time));
}

async function example() {
    await sleep(4000);
    return 1;
}

console.log(await example());

Похожие вопросы