2014-11-24 10 views
20

मैंने 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 

} 

और मैं एसबीटी 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 

क्या याद आ रही है/लागू नहीं किया गया? मैं इसे कैसे कार्यान्वित कर सकता हूं? क्या आसपास कोई काम है? मैं निष्पादन कॉन्टेक्स्ट को कैसे कार्यान्वित कर सकता हूं जो ब्राउज़र के साथ ईवेंट को संभालने के लिए समझ में आता है?

उत्तर

27

Scala.js 0.6.0 के बाद, मानक globalExecutionContext Scala.js में उपलब्ध है। आप

import scala.concurrent.ExecutionContext.Implicits.global 

// now you get to play with Futures 

Scala.js में साथ यह आयात कर सकते हैं, यह scala.scalajs.concurrent.JSExecutionContext.Implicits.queue को एक उपनाम है। यह निष्पादन संदर्भ मानक जावास्क्रिप्ट इवेंट लूप में नौकरियों को संलग्न करता है।

ध्यान दें कि कार्यों को असीमित रूप से निष्पादित किया जाता है, लेकिन समानांतर में नहीं, क्योंकि जावास्क्रिप्ट में प्रति समानता की कोई धारणा नहीं है। यदि समांतरता की आवश्यकता है, Web Workers का उपयोग करने की आवश्यकता है, लेकिन वे Future एस द्वारा आवश्यक साझा-मेमोरी मॉडल प्रदान नहीं करते हैं।

पुराना जवाब Scala.js को < 0.6.0

वहाँ 2 मौजूदा और scala.scalajs.concurrent.JSExecutionContext में काम कर ExecutionContext आंतरिक वस्तु Implicits में निहित संस्करणों के साथ, कर रहे हैं को लागू करने। बस उस व्यक्ति को आयात करें जो आपके लिए समझ में आता है (शायद queue, दूसरा वास्तव में असीमित नहीं है)।

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

// now you get to play with Futures 
+0

एक छोटी अनुसंधान के बाद, 'queue' का उपयोग कर कार्यान्वित किया जाता है या तो [वादे] (https://www.promisejs.org/) या [समय समाप्ति] (का उपयोग कर http://www.w3schools.com/ jsref/met_win_settimeout.asp) पुराने ब्राउज़र के लिए वादे का समर्थन नहीं करते हैं। – Suma

+0

नोट: 'कतार' इस अर्थ में अतुल्यकालिक है कि बाद में कोड निष्पादित किया जाता है (फिर एक हल किए गए वादे या सेटटाइमआउट पर उपयोग करके), लेकिन कोड समानांतर में नहीं चलता है। असली "समांतर" (समवर्ती) कार्यों के लिए आपको वेब श्रमिकों की आवश्यकता है, उदाहरण के लिए github.com/nolanlawson/promise-worker से लाइब्रेरी का उपयोग करना। या मैं यहाँ गलत हूँ? – Suma

+0

@ सुमा आप सही हैं। जावास्क्रिप्ट में साझा-स्मृति समांतरता जैसी कोई चीज़ नहीं है, इसलिए 'वादा और' भविष्य का समानांतर में निष्पादित नहीं होता है। यदि समांतरता की आवश्यकता है, तो आपको वेब श्रमिकों का उपयोग करने की आवश्यकता है, लेकिन आप साझा स्मृति खो देते हैं, जो मूल रूप से बदलता है कि चीजें अपने अधिकार में कैसे काम करती हैं। – sjrd

संबंधित मुद्दे