当前位置: 首页 > 知识库问答 >
问题:

未来回调方法和promise[成功和失败]之间的区别?

蒯胜泫
2023-03-14

我正在使用FuturePromises学习Scala并发

我不明白,使用< code >回调方法完成未来和使用promise之间的确切区别是什么?

这是否意味着未来回调方法实际上没有完成未来?只有使用promise,我们才能完成未来?

还有,我见过很多像你这样的地方,既可以阅读期货,也可以阅读无极,但你只能写信给无极。

共有3个答案

郎星汉
2023-03-14

您实际上并没有完成< 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

咸昀
2023-03-14

你不能< code >完成一个< code >未来。

未来应该是一个计算,这个计算(一旦开始)当它开始时就完成了。创建后,您无法控制它。您可以为其分配 onComplete 回调,该回调将在此将来完成时触发,但您无法控制何时会触发。

如果你想拥有一个你可以控制完成的Future,你可以像政治家一样PromisethatFuture。现在你是成功还是失败地完成那个未来取决于你。

// 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))
傅博容
2023-03-14

期货仅在异步计算结束时完成:

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或未来?