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

У меня возникла интересная ситуация, для которой мой обычно умный ум не смог найти решение :) Вот ситуация...

У меня есть класс, который имеет метод get()... этот метод вызывается для получения сохраненных предпочтений пользователя... что он делает, так это обращается к какому-то базовому провайдеру, чтобы получить данные... как написано сейчас, он обращается к провайдеру, который говорит о cookies... так, get() вызывает providerGet(), скажем, providerGet() возвращает значение, а get() передает его вызывающей стороне. Вызывающая сторона ожидает ответа, прежде чем продолжить свою работу.

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

Итак, вопрос заключается в том, есть ли способ по существу "заблокировать" возврат от providerGet() до тех пор, пока не вернется асинхронный вызов? Обратите внимание, что для моих целей меня не волнуют последствия производительности, которые это может иметь, я просто пытаюсь понять, как это сделать.

Я не думаю, что есть способ, я точно знаю, что не смог придумать его... поэтому я хотел выкинуть его и посмотреть, что другие люди могут придумать :)

edit: Я только сейчас узнал, что суть проблемы, тот факт, что web sql API является asychronous, может иметь решение... оказывается, есть и синхронная версия API, чего я не знал... Я сейчас читаю документацию, чтобы понять, как ее использовать, но это решило бы проблему, поскольку единственная причина, по которой providerGet() был написан асихронно, - это возможность использования этого провайдера... код, частью которого является get(), - это мой собственный слой абстракции над различными провайдерами хранения (cookies, web sql, localStorage и т.д.), поэтому должен победить наименьший общий знаменатель, что означает, что если один из них асихронный, то они ВСЕ должны быть асихронными. ... единственное, что было - это web sql... так что если есть способ сделать это синхронно, то моя точка зрения становится спорной (хотя в целом вопрос все равно интересный)

edit2: А, ну, похоже, тут ничего не поделаешь... похоже, синхронная версия API не реализована ни в одном браузере, а даже если и реализована, то указано, что ее можно использовать только из рабочих потоков, так что это не похоже на помощь. Хотя, читая некоторые другие вещи, кажется, что есть способ провернуть этот трюк с помощью рекурсии... Сейчас я собираю тестовый код, я опубликую его, если/когда он заработает, кажется, что это очень интересный способ обойти любую подобную ситуацию в общем виде.

edit3: Согласно моим комментариям ниже, на самом деле нет способа сделать именно то, что я хотел. Решение, которое я выбрал для решения моей насущной проблемы, заключается в том, чтобы просто не разрешить использование web SQL для хранения данных. Это не идеальное решение, но поскольку эта спецификация находится в процессе развития и не получила широкого распространения, это не конец света... надеюсь, когда она будет должным образом поддерживаться, появится синхронная версия, и я смогу подключить новый провайдер для нее, и все будет в порядке. В общем, похоже, нет никакого способа сделать это чудо... подтверждает то, что я ожидал, но хотел бы я ошибиться в этот раз :)

17
задан Cœur 18 January 2018 в 04:28
поделиться