Nano Hash - криптовалюты, майнинг, программирование

Фьючерсы в Scala.js

Я пытался использовать промисы и фьючерсы в Scala.js. Обещание работает, как только дело доходит до фьючерсов, я получаю предупреждения и ошибки.

Пытаться:

val p1 = Promise[Int]
val f1: Future[Int] = p1.future
val p2 = Promise[Int]
val f2: Future[Int] = p2.future

val res1 =  for {
   v1 <- f1
   v2 <- f2
} yield v1 + v2


val res2 = f1.flatMap(x => f2.map(y => x + y))



res1 onSuccess {
  case x: Int => g.console.log(x);

}

res2 onSuccess {
  case x: Int => g.console.log(x);

}

// callback in dom, using ScalaTags
// div(`class` := "btn  btn-default", `type` := "button", onclick := click(1, p1))
def click(i: Int, p: Promise[Int])(x: dom.MouseEvent): Unit = {
  g.console.log(i);
  try {
    p success i
  }
  catch {
    case x: Throwable => println("again")
  }
}

f1 onSuccess {
  case x: Int => 1

}

И я получаю в sbt fastOptJs:

[warn] Referring to non-existent class jl_Thread$UncaughtExceptionHandler
[warn]   called from s_concurrent_impl_ExecutionContextImpl.init___ju_concurrent_Executor__F1
[warn]   called from s_concurrent_impl_ExecutionContextImpl$.fromExecutor__ju_concurrent_Executor__F1__s_concurrent_impl_ExecutionContextImpl
[warn]   called from s_concurrent_ExecutionContext$Implicits$.global$lzycompute__p1__s_concurrent_ExecutionContextExecutor
[warn]   called from s_concurrent_ExecutionContext$Implicits$.global__s_concurrent_ExecutionContextExecutor
[warn]   called from Lexample_H2$class.Lexample_H2$class__$init$__Lexample_H2__V
[warn] 

И получаю в браузере:

uncaught exception: java.lang.RuntimeException: System.getProperty() not implemented

Что отсутствует/не реализовано? Как я могу это реализовать? Есть ли обходной путь? Как я могу реализовать ExecutionContext, который имеет смысл обрабатывать события в браузере?


Ответы:


1

Начиная с Scala.js 0.6.0, стандарт global ExecutionContext Scala доступен в Scala.js. Вы можете импортировать его с помощью

import scala.concurrent.ExecutionContext.Implicits.global

// now you get to play with Futures

В Scala.js это псевдоним scala.scalajs.concurrent.JSExecutionContext.Implicits.queue. Этот контекст выполнения ставит задания в очередь в стандартном цикле обработки событий JavaScript.

Обратите внимание, что задачи выполняются асинхронно, а не параллельно, поскольку в JavaScript нет понятия параллелизма как такового. Если требуется параллелизм, необходимо использовать Web Workers. , но они не обеспечивают модели разделяемой памяти, необходимой для Futures как таковой.

Старый ответ относится к Scala.js ‹ 0.6.0

Есть 2 существующих и работающих ExecutionContext в scala.scalajs.concurrent.JSExecutionContext с неявными версиями во внутреннем объекте Implicits. Просто импортируйте тот, который имеет смысл для вас (вероятно, queue, другой на самом деле не асинхронный).

import scala.scalajs.concurrent.JSExecutionContext.Implicits.queue

// now you get to play with Futures
24.11.2014
  • После небольшого исследования queue реализуется либо с помощью обещаний, либо с помощью тайм-ауты для старых браузеров, не поддерживающих промисы. 06.01.2017
  • Примечание. queue является асинхронным в том смысле, что код выполняется позже (используя then для разрешенного Promise или setTimeout), но код не выполняется параллельно. Для реальных параллельных (параллельных) задач вам понадобятся веб-воркеры, например, с помощью библиотеки с github.com/nolanlawson/promise-worker. Или я ошибаюсь здесь? 06.01.2017
  • @Сума Ты прав. В JavaScript нет такой вещи, как параллелизм с общей памятью, поэтому Promises и Futures не выполняются параллельно. Если требуется параллелизм, вам нужно использовать Web Workers, но вы теряете разделяемую память, что коренным образом меняет то, как все работает само по себе. 06.01.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..