2014-12-01 44 views
6

Tôi có một dự án MVC mùa xuân Maven rất đơn giản và tôi đã thêm Scala vào nó. Tôi muốn ba tương lai sau đây thực hiện đồng thời như chúng được cho là vậy. Tuy nhiên, chúng thực thi một cái khác sauScala Futures không chạy song song

val viewName: Future[String] = for { 
    profileSync <- Future { EmployeeLocalServiceUtil.syncProfileInformation() } 
    earningsSync <- Future { EmployeeLocalServiceUtil.syncEarnings() } 
    reimbursementSync <- Future { EmployeeLocalServiceUtil.syncReimbursements() } 
} yield { 
    "employee/view" 
} 

Máy của tôi có 4 lõi và tôi đang sử dụng ngữ cảnh scala.concurrent.ExecutionContext.Implicits.global. Ngoài việc này không có cấu hình có thể ngăn chặn/cho phép thực hiện song song của tương lai.

Trả lời

8

Để hiểu được chỉ là cú pháp và là translated to flatMap like in Example 2.

Có nghĩa là mã của bạn xấp xỉ sẽ trông như thế này:

Future { ??? }.flatMap { profileSync => 
    Future { ??? }.flatMap { earningsSync => 
    Future { ??? }.map { reimbursementSync => 
     // Able to access profileSync/earningsSync/reimbursementSync values. 
     "employee/view" 
    } 
    } 
} 

Như bạn thấy Future s chỉ được đưa ra sau khi trước đó đã hoàn thành. Để bắt đầu lần đầu tiên, hãy bắt đầu Future giây của bạn và sau đó thực hiện để hiểu:

val profileSyncFuture = Future { EmployeeLocalServiceUtil.syncProfileInformation()  } 
val earningsSyncFuture = Future { EmployeeLocalServiceUtil.syncEarnings()  } 
val reimbursementSyncFuture = Future { EmployeeLocalServiceUtil.syncReimbursements()  } 

val viewName: Future[String] = for { 
    profileSync <- profileSyncFuture 
    earningsSync <- earningsSyncFuture 
    reimbursementSync <- reimbursementSyncFuture 
} yield { 
    "employee/view" 
} 
+0

Cảm ơn Akos vì đã giải thích rõ. Tôi đã hiểu lầm về sự hiểu biết trước đó. – Robin

Các vấn đề liên quan