3

Можно просто инкапсулировать количество синхронных запросов в качестве асинхронного запроса.Корпус для синхронизации 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 для аргумента async, когда глобальная среда JavaScript является средой документа. Пользовательским агентам настоятельно рекомендуется предупреждать о таком использовании в инструментах разработчика и может экспериментировать с вызовом исключения InvalidAccessError, когда это происходит. @https://xhr.spec.whatwg.org/

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

Вот главный вопрос наряду с последующим наблюдением.

  • Есть ли что-то не так с примером, который я дал?

Если нет, то:

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

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

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

ответ

0

Этот ответ редактировался.

Да, я рассуждал неправильно!

Есть два угла, о которых нужно подумать. Что на самом деле означает асинхронность в javascript? Может ли один асинхронный вызов задержать другой асинхронный вызов?

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

Это означает, придающее synchrounous запрос в SetTimeout может быть ждет для не удался запроса, который заканчивается, блокируя другие неродственные асинхронные запросы, где как «асинхронный: истинная» функция только будет выполнять на основу его государственное значения.

Это означает старшую поддержку браузера требует от вас запросов цепи или использовать DOM в качестве среды, когда вам нужно сделать несколько запросов, которые зависят от another..Ugh ...

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

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

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

EDIT (Again ..) На самом деле, возможно, будет возможно использовать 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); 
} 
Смежные вопросы