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