我正在使用Future
和Promises
学习Scala并发
。
我不明白,使用< code >回调方法完成未来和使用promise之间的确切区别是什么?
这是否意味着未来回调方法实际上没有完成未来?只有使用promise,我们才能完成未来?
还有,我见过很多像你这样的地方,既可以阅读期货,也可以阅读无极,但你只能写信给无极。
您实际上并没有完成< code>Future,您只是在完成时将回调传递给trigger。您可以使用< code>Promise来控制何时触发回拨。scala官方文档示例:
val p = Promise[T]()
val f = p.future
val producer = Future {
val r = produceSomething()
p success r
continueDoingSomethingUnrelated()
}
顺便说一句,未来
在引擎盖下使用promise
。
你不能< code >完成一个< code >未来。
未来
应该是一个计算,这个计算(一旦开始)当它开始时就完成了。创建后,您无法控制它。您可以为其分配 onComplete
回调,该回调将在此将来完成时触发,但您无法控制何时会触发。
如果你想拥有一个你可以控制完成的Future
,你可以像政治家一样Promise
thatFuture
。现在你是成功还是失败地完成那个未来取决于你。
// lets promise an Int
val promise = Promise[Int]()
// Now... we also have a future associated with this promise
val future = promise.Future
// assign a callback which will be called when future completes
future.onComplete(
case Success(i) => println("Future complete :: " + i)
case Failure(ex) => println("Future failed :: " + ex.toString)
)
// Future by itself provides you no way to complete it
// if you want to complete this future, you can fulfil your promise
promise.complete(Try(10))
期货仅在异步计算结束时完成:
val f: Future[List[Int]] = Future {
makeSomeNumbers() //when this finishes, the Future is completed.
}
f onSuccess {
case foo => println("I was completed when makeSomeNumbers finished")
}
而promise可以创造一个可以人工完成的未来。
val p = Promise[String]()
val f = p.future
p success('hi') //when success is called, the Future is completed.
f onSuccess {
case foo => println("I was completed because a Promise told me to do so")
}
传递给< code>onSuccess的回调并不完成未来,它只在未来完成时监听并做一些事情。在promise的情况下,您可以调用它的< code>success方法来完成其关联的未来。
我有一个未来[T],我想在成功和失败上映射结果。 比如说 如果我使用< code>map或< code>flatmap,它将只映射成功的未来。如果我使用< code>recover,它将只映射失败的期货。< code>onComplete执行回调,但不返回修改后的未来值。< code>Transform可以工作,但是需要两个函数而不是一个部分函数,所以有点难看。 我知道我可以做出一个新的,并用或/
问题内容: 我知道defer分隔诺言状态的控制和过程,这里以Q为例,返回的诺言和完全不同,为什么这样设计?这两个“承诺”有什么区别 问题答案: 好吧,这是关于承诺解决方案源的。Q和其他许多库提供两个API: 旧版API-您可以在其中创建一个递延函数, 并承诺可以返回。 Promise构造函数 -这是现代API,您可以在其中从完成源创建Promise。 粗略地做: 是相同的: 所以你可能会问 为什么
和之间有什么区别? 它们都像未来结果的占位符,但是主要区别在哪里?
问题内容: 在护照[配置身份验证]文档中,它具有看上去很吓人的功能,该功能使用了神秘功能“完成”。 现在,在快速文档中,有许多方法可以传递称为next的方法。 这是快递和护照这两个框架之间的区别吗?还是他们在做两件事? 问题答案: 这是快递和护照这两个框架之间的区别吗? 不,它们的用途不同。Express用作node.js上的应用程序框架,其中护照仅处理Web应用程序的身份验证部分。 关于next
问题内容: 我缺少一些基本的理解/理论,我不理解这些函数调用之间的区别: 我在这里想要做到的是获取一家商店的分销商列表(多对多关系),并且他们将每个啤酒分销商列表都整合到一个巨型列表中。 我不知道这是否是执行此操作的最佳方法,但我无法使其正常工作。与第一批方法类似,我不知道是否需要或 更新资料 感谢所有回答!这将是我前进的良好参考。我最大的教训是取回集合与取回查询构建器/关系对象之间的区别。为了将
我通常会在vert. x垂直的开头看到Promise和Future的使用。两者之间有什么具体的区别吗?我在Scala语言中读到过它们的差异,在Vert. x的情况下也是如此吗?还有我什么时候应该知道什么时候使用Promise或未来?