У меня интересная ситуация, для которой мой обычно умный ум не смог найти решение :) Вот ситуация ...
У меня есть класс, у которого есть метод get ()... этот метод вызывается для получения сохраненных пользовательских настроек ... он обращается к какому-либо базовому провайдеру для фактического получения данных ... как написано сейчас, он вызывает провайдера, который говорит куки-файлы ... итак, получаем() вызывает providerGet (), скажем, providerGet () возвращает значение и get () передает его вызывающей стороне.Вызывающий ожидает ответ прежде, чем он продолжит свою работу, очевидно.
Вот сложная часть ... Я сейчас пытаюсь реализовать поставщика, который является асинхронным по своей природе (с использованием локального хранилища в этом случае) ... так, providerGet () вернется сразу же, отправив вызов в локальное хранилище, которое через некоторое время вызовет функцию обратного вызова, которая была ему передана ... но, так как providerGet () уже вернулась, и поэтому get ()теперь, в дополнение к исходному вызову, он, очевидно, не возвратил фактические извлеченные данные.
Итак, вопрос заключается в том, есть ли способ по существу «заблокировать» возврат из providerGet () до асинхронного вызовавозвращается?Обратите внимание, что для моих целей меня не интересуют возможные последствия для производительности, я просто пытаюсь выяснить, как заставить это работать.
Я не думаю, что есть способ, конечно, я знаюЯ не смог придумать это ... поэтому я хотел выбросить это и посмотреть, что другие люди могут придумать:)
edit: я только сейчас узнаю, что ядропроблема, тот факт, что web sql API является асинхронным, может иметь решение ... оказывается, есть и синхронная версия API, что-то, чего я не осознавал ... Сейчас я читаю документы, чтобы увидетькак его использовать, но это решило бы проблему хорошо, поскольку единственная причина, по которой providerGet () был написан вообще асинхронно, заключалась в том, чтобы допустить этого поставщика ... код, частью которого является get (), является моим собственным уровнем абстракции над различнымипровайдеры хранения (cookie, web sql, localStorage и т. д.), поэтому наименьший общий знаменатель должен победить, а это означает, что если один асинхронный, они ВСЕ должны быть асинхронными ... единственныйчто было такое веб-SQL ... так что если есть способ сделать это синхронно моя точка становится спорно (еще интересный вопрос в общем, я думаю, хотя)
1012 * edit2: Ну что ж, никакой помощи там не кажется ...похоже, что синхронная версия API не реализована ни в одном браузере, и даже если было указано, что она может быть использована только из рабочих потоков, то, похоже, это не поможет.Хотя, читая некоторые другие вещи, кажется, что есть способ извлечь из этого трюк с помощью рекурсии ... Сейчас я собираю некоторый тестовый код, я опубликую его, если / когда я получу его работу, кажется очень интереснымспособ обойти любую такую ситуацию в общем.
edit3: Согласно моим комментариям ниже, на самом деле нет никакого способа сделать именно то, что я хотел.Решение, с которым я собираюсь решить мою непосредственную проблему, состоит в том, чтобы просто не разрешать использование веб-SQL для хранения данных.Это не идеальное решение, но так как эта спецификация постоянно меняется и, во всяком случае, не получила широкого применения, это не конец света ... надеюсь, что при правильной поддержке синхронная версия будет доступна, и я могу подключить нового провайдера ихорошо идтиВ общем, хотя, похоже, нет никакого способа извлечь из этого чуда ... подтверждает, что я ожидал, что дело, но хотелось бы, чтобы я ошибся в этот раз:)