Как заблокировать асинхронные функции в JavaScript

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

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

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

Любые идеи? Спасибо.

+9
источник поделиться
5 ответов

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

Вот как это выглядело бы в Stratified 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");
}
+8
источник

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

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

+1
источник

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

У вас есть ответ здесь: Как я могу получить jQuery для выполнения синхронного, а не асинхронного запроса Ajax?

+1
источник

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

$(document).ajaxStop(function() {
    // do your "ajax dependent" stuff here
});
+1
источник

Почему не просто:

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

Какова точка функции обертки?

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

var state = syncCall("request");
0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос