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

未来和promise有什么区别?

班承恩
2023-03-14

FuturePromise之间有什么区别?
它们都像未来结果的占位符,但是主要区别在哪里?

共有3个答案

穆彬郁
2023-03-14

我知道已经有了一个公认的答案,但还是想补充一点:

TLDR:Future和Promise是异步操作的两个方面:消费者/调用方与生产者/实现方。

作为异步API方法的调用者,您将获得一个Future作为计算结果的句柄。例如,您可以对其调用get(),等待计算完成并检索结果。

现在想想这个API方法实际上是如何实现的:实现者必须立即返回Future。他们负责在计算完成后立即完成未来的工作(他们将知道这一点,因为它正在实现分派逻辑;-)。他们将使用Promise/CompletableFuture来实现这一点:构建并立即返回CompletableFuture,并在计算完成后调用complete(T result)

向实
2023-03-14

根据本次讨论,Promise最终被称为CompletableFuture,用于包含在Java 8中,其javadoc解释如下:

可显式完成的未来(设置其值和状态),并可用作CompletionStage,支持在完成时触发的依赖函数和操作。

列表中还提供了一个示例:

f.then((s -> aStringFunction(s)).thenAsync(s -> ...);

请注意,最终的API略有不同,但允许类似的异步执行

CompletableFuture<String> f = ...;
f.thenApply(this::modifyString).thenAccept(System.out::println);
齐阳
2023-03-14

(到目前为止,我对答案不太满意,所以我尝试一下……)

我认为凯文·赖特的评论(“你可以做出promise,由你来遵守。当别人向你做出promise时,你必须等着看他们将来是否兑现”)总结得很好,但是一些解释可能是有用的。

期货和promise是非常相似的概念,区别在于期货是一个只读容器,用于存储尚未存在的结果,而promise可以编写(通常只编写一次)。Java 8 CompletableFuture和Guava SettableFuture可以被视为promise,因为它们的值可以设置(“completed”),但它们也实现了Future接口,因此对于客户端来说没有区别。

未来的结果将由“其他人”设定——由异步计算的结果设定。请注意,未来任务——一个经典的未来——必须用可调用或可运行初始化,没有无参数构造函数,未来和未来任务都是从外部只读的(未来任务的集合方法受到保护)。该值将从内部设置为计算结果。

另一方面,promise的结果可以由“你”(或者事实上由任何人)随时设置,因为它有一个公共设置器方法。完全未来和设置未来都可以在没有任何任务的情况下创建,并且它们的值可以随时设置。您向客户端代码发送一个promise,并在以后按您的意愿实现它。

请注意,CompletableFuture不是一个“纯粹”的promise,它可以像FutureTask一样用任务初始化,它最有用的特性是处理步骤的不相关链接。

还要注意,promise不一定是未来的子类型,也不一定是同一个对象。在Scala中,Future对象由异步计算或不同的Promise对象创建。C中的情况类似:promise对象由生产者使用,未来对象由消费者使用。这种分离的好处是客户端无法设置未来的值。

Spring和EJB3.1都有一个AsyncResult类,类似于Scala/Cpromise。AsyncResult确实实现了Future,但这不是真正的Future:Spring/EJB中的异步方法通过一些后台魔术返回一个不同的只读Future对象,客户端可以使用第二个“真正”的Future来访问结果。

 类似资料:
  • 我通常会在vert. x垂直的开头看到Promise和Future的使用。两者之间有什么具体的区别吗?我在Scala语言中读到过它们的差异,在Vert. x的情况下也是如此吗?还有我什么时候应该知道什么时候使用Promise或未来?

  • 问题内容: Promise和AJAX调用都是异步操作。两者都可以进行GET / POST请求。<< 编辑:那是错误的陈述 那么它们之间有什么区别呢?并且什么时候最好使用一个而不是另一个呢? 另外,还有一件事: 最近,我遇到了一个承诺,其中包含AJAX。为什么要在异步操作中放入异步操作?这就像在面包三明治中放一块面包。 此处使用jQuery。并且AJAX调用具有Promise行为和属性。我没有早些得

  • 问题内容: 我已经在移动应用程序和Web应用程序中使用过ECMAScript 6 和ECMAScript 7功能(由于Babel)。 第一步显然是达到ECMAScript 6级别。我学习了许多异步模式,promise(确实是很有希望的),生成器(不确定为什么使用*符号)等。其中,promise非常适合我的目的。而且我已经在我的应用程序中使用它们很多次了。 这是我如何实现基本诺言的示例/伪代码- 随

  • 问题内容: 据我所知并纠正我是否有错,redux-thunk是一个中间件,可以帮助我们在操作本身中调度异步函数并调试值,而当我使用redux- promise时 ,如果不实现自己的实现就无法创建异步函数作为Action的机制抛出仅分配纯对象的异常。 这两个软件包之间的主要区别是什么?在单个页面react应用程序中使用这两个软件包或坚持redux-thunk就足够了吗? 问题答案: 允许您的动作创建

  • 可能的重复: 在JavaScript中Deferred、Promise和Future之间有什么区别? 有人能指出回调和promise之间有什么不同吗?什么时候应该使用promise等? 此外,关于如何创建和使用promise的链接将得到赞赏。

  • 问题内容: 和之间有什么区别? 它们都充当未来结果的占位符,但是主要区别在哪里? 问题答案: 根据讨论,终于被要求包含在Java 8中,其javadoc解释了: 可以明确完成(设置其值和状态)并可以用作CompletionStage的Future,它支持在完成时触发的相关功能和操作。 列表上还提供了一个示例: 请注意,最终的API稍有不同,但允许类似的异步执行: