Как заблокировать асинхронные функции в JavaScript - PullRequest
10 голосов
/ 03 декабря 2010

Мне нужно написать функцию на JavaScript, которая возвращает состояние от вызова асинхронной функции.Однако вызывающая сторона только получает значение, и никакая функция обратного вызова не должна предоставляться.Я пробовал что-то вроде:

function getState() {
    var ret = null;
    asyncCall("request",
        function() { ret = "foo"; } // callback
    );
    while (ret === null)
        ; // block on the asynchronous call
    return ret;
}

Однако цикл никогда не закончится ...

Есть идеи?Спасибо.

Ответы [ 5 ]

9 голосов
/ 03 декабря 2010

Я думаю, что вы ищете StraifiedJS, http://stratifiedjs.org Это позволяет вам «организовать» ваш асинхронный код точно так же, как вы написали, ОСТЕРЕГАЙТЕСЬ, что он «пишет» как синхронный код, он НЕ заблокирует остальную часть вашего приложения. Вы можете использовать его где угодно, загрузив библиотеку apollo js.

Вот как это будет выглядеть в стратифицированном JavaScript:

function getState() {
  waitfor (var ret) {
    // block on the asynchronous call
    asyncCall("request", resume);
  }
  return ret;
}

конечно, есть модули / библиотеки, которые бы выглядели так: http://onilabs.com/modules#http

function getState() {
  return http.get("request");
}
1 голос
/ 19 июня 2014

Если я не понял ваш вопрос, вы можете посмотреть на событие jQuery ajaxStop () - http://api.jquery.com/ajaxstop. Это блокирует, пока все вызовы ajax не будут завершены. Это, очевидно, требует, чтобы все ваши асинхронные вызовы выполнялись через jQuery.

$(document).ajaxStop(function() {
    // do your "ajax dependent" stuff here
});
1 голос
/ 03 декабря 2010

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

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

1 голос
/ 03 декабря 2010

вы пытаетесь сделать синхронный вызов , поэтому не стоит делать это с помощью функции, предназначенной для асинхронного вызова.

Выответ здесь: Как заставить jQuery выполнять синхронный, а не асинхронный Ajax-запрос?

1 голос
/ 03 декабря 2010

Почему бы просто:

asyncCall("request", function() {
    // here you can inspect the state
});

Какой смысл в функции-обертке?

Асинхронные функции работают таким образом. Если вы хотите заблокировать выполнение, используйте синхронный вызов:

var state = syncCall("request");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...