Дело в том, что xmlhttprequest доступен в синхронизации

Можно просто инкапсулировать количество синхронных запросов как асинхронный запрос.

Параметр "func" в приведенном ниже коде может, например, содержать несколько синхронных запросов по порядку. Это должно дать вам больше власти над данными, контрастируя с использованием DOM в качестве средства воздействия на данные. (Есть ли другой способ? Это было давно, так как я использовал javaScript)

function asyncModule(func)
{
    "use strict";
    var t, args;
    t = func.timeout === undefined ? 1 : func.timeout;
    args = Array.prototype.slice.call(arguments, 1);
    setTimeout(function () {
        func.apply(null, args);
    }, t);
}

Теперь что-то должно быть не так с моими рассуждениями, потому что вот что говорит спецификация:

Синхронный запрос XMLHttpRequest за пределами рабочих находится в процессе удаления с веб-платформы, поскольку он оказывает пагубное влияние на работу конечного пользователя. (Это долгий процесс, который занимает много лет.) Разработчики не должны передавать false для асинхронного аргумента, когда глобальная среда JavaScript является средой документов. Пользовательским агентам настоятельно рекомендуется предупреждать о таком использовании в инструментах разработчика и могут поэкспериментировать с генерированием исключения InvalidAccessError при его возникновении. @ https://xhr.spec.whatwg.org/

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

Вот главный вопрос, а также продолжение.

  • Что-то не так с примером, который я привел?

Если нет, то:

  • Как заставить запросы быть асинхронными правильным решением?

Само собой разумеется, что у вас есть свобода опровергать любые мои "претензии", если они просто неверны или наполовину истины. Я смущен этим, я даю вам это.

Имейте в виду, что я тестирую javaScript в терминале, а не в браузере. Я использовал веб-сервер на языке программирования GO, и все, кажется, работает нормально. Только когда я протестирую код в браузере, я получаю подсказку для этой спецификации.

1 ответ

Этот ответ был отредактирован.

Да я мои рассуждения ошибочна!

Есть два угла для размышления. Что на самом деле означает асинхронность в JavaScript? Может ли один асинхронный вызов остановить другой асинхронный вызов?

Асинхронность в javascript не означает, что скрипт будет работать в чередующихся / чередующихся процессах с более чем одним стеком вызовов. Это может быть больше похоже на глобальную команду отложенного / отложенного времени, которая полностью вступит во владение, как только получит свой шанс. Это означает, что асинхронный вызов может быть блокирующим, а неблокирующая часть "async:true" является всего лишь "уловкой", основанной на том, как реализован xhttprequest.

Это означает, что инкапсуляция синхронного запроса в setTimeout может ожидать неудачного запроса, который в итоге блокирует другие несвязанные асинхронные запросы, в которых функция async: true будет выполняться только на основании значения своего состояния.

Это означает, что поддержка старых браузеров требует, чтобы вы объединяли запросы или использовали DOM в качестве средства, когда вам нужно выполнить несколько запросов, которые зависят от другого... Тьфу...

К счастью для нас, у Javascript есть темы. Теперь мы можем просто использовать потоки, чтобы получить чистую инкапсуляцию нескольких взаимосвязанных запросов в синхронизации. (или любые другие фоновые задачи)

Вкратце: браузер не должен иметь проблем с выполнением запроса в синхронизации, если он внутри рабочего. Браузеры пока не стали ОС, но они ближе.

PS Этот ответ более или менее из-за проб и ошибок. Я сделал несколько тестовых случаев вокруг Firefox и заметил, что асинхронный запрос останавливает другие асинхронные запросы. Я просто экстраполирую это наблюдение. Я не приму мой собственный ответ, если я все еще что-то упустил.

РЕДАКТИРОВАТЬ (снова..) На самом деле, возможно, можно использовать xhttp.timeout вместе с xhttp.ontimeout. См. Timeout XMLHttpRequest. Это означает, что вы можете восстанавливаться после неверных запросов, если вы абстрагируете setTimeout и используете его как график.

// Simple example
function runSchedular(s)
{
    setTimeout(function() {
        if (s.ptr < callQue.length) {
            // Handles rescheduling if needed by pushing the que.
            s = s.callQue[s.ptr++](s);
        } else {
            s.ptr = 0;
            s.callQue = [];
            s.t = 200;
        }
        runSchedular(s);
    }, s.t);
}
Другие вопросы по тегам