美文网首页
异步编程之Future和Promise

异步编程之Future和Promise

作者: landscape_f117 | 来源:发表于2020-09-16 17:27 被阅读0次

最近在拾遗JS基础,看到Promise,总觉得和Java中的Future有联系,放在一块对比总结一下,加深记忆。

异步编程

异步编程是为了提高效率。其实这是一种在工作、生活都中非常常见的策略。
比如,我们跟别人交待任务,拜托别人完成了通知我们,这就是一种异步。我们不需要等到别人完成了再继续我们自己的工作,而只要等待别人的通知即可。我们和别人可以并行的做事。

既然是并行,那就需要至少两个干活的人,在计算机里面通常意味着多线程,问题来了JS是单线程的,那是怎么做到的呢?
答案是:虽然JS运行在浏览器中,是单线程的,但浏览器不是单线程的。浏览器中很多异步行为都是由浏览器新开一个线程去完成。javascript引擎线程是浏览器多个线程中的一个,它本身是单线程的。浏览器还包括很多其他线程,如界面渲染线程,浏览器事件触发线程,Http请求线程等。所以,所谓的javascript是单线程的,是指javascript运行在浏览器中是单线程的,叫做javascript引擎线程。

顺带提一下同步异步和阻塞、非阻塞的区别。这也是一个老生常谈的问题:
同步/异步是从行为角度描述事物的,而阻塞和非阻塞描述的当前事物的状态(等待调用结果时的状态)。
具体可以看这个:『怎样理解阻塞非阻塞与同步异步的区别?』

Future

好了下面说一下future。这个是是java的concurrent并发包里面的提供的类,他和Callable类常常一块使用。Future 表示异步计算的结果。其用于获取线程池执行callable后的结果,这个结果封装为Future类。

值得一提的是,由于Future类获取返回结果的get方法是阻塞的,jdk1.8中加入completableFuture使得Future可以注册监听器从而实现类似JS中的callback功能。这也是异步编程的推荐方式:回调。

Promise

回调是一种我们推崇的异步调用方式,但也会遇到问题,也就是回调的嵌套。当需要多个异步回调一起书写时,就会出现下面的代码 (以 js 为例):

asyncFunc1(opt, (...args1) => { 
  asyncFunc2(opt, (...args2) => {       
    asyncFunc3(opt, (...args3) => {            
      asyncFunc4(opt, (...args4) => {
          // some operation
      });
    });
  });
});

这样的代码不易读,嵌套太深修改也麻烦。于是 ES6 提出了 Promise 模式来解决回调地狱的问题。
Promise 是一个 ECMAScript 6 提供的类,目的是更加优雅地书写复杂的异步任务。

new Promise(function (resolve, reject) {
    console.log(1111);
    resolve(2222);
}).then(function (value) {
    console.log(value);
    return 3333;
}).then(function (value) {
    console.log(value);
    throw "An error";
}).catch(function (err) {
    console.log(err);
});

Future和Promise的区别

通常,Future 和 Promise 两个名词在这个并发模型里是混用的,无论是 Future 还是 Promise 都指代一个用于取得计算结果的代理或者计算结果的容器。不同之处是Future代表一个只读的还不存在的结果的容器。而Promise是一次性可写的。但Promise也实现了Future的接口。

Java 1.8 版本引入了 CompletableFuture 对象,这个对象实现的 CompletionStage 接口定义了一系列的流畅的编程接口以支持灵活扩展异步计算。此外,CompletableFuture 支持手动设定计算的结果,这就实现了 Promise 写入的语义。此前,我们只能通过立即返回的 Callable 来绕过。总的来说,CompletableFuture 是一个 Future 和 Promise 语义兼具的重载对象。

参考

https://www.zhihu.com/question/31982417/answer/54136684
https://www.cnkirito.moe/future-and-promise/
https://stackoverflow.com/questions/14541975/whats-the-difference-between-a-future-and-a-promise#:~:text=Futures%20and%20promises%20are%20pretty,written%20(normally%20only%20once).&text=The%20result%20of%20the%20future,result%20of%20an%20asynchronous%20computation.
https://zhuanlan.zhihu.com/p/71824799

相关文章

  • 异步编程之Future和Promise

    最近在拾遗JS基础,看到Promise,总觉得和Java中的Future有联系,放在一块对比总结一下,加深记忆。 ...

  • Future

    juc.Future:Java异步操作结果 Future:Netty异步操作结果 Promise:可设置结果的异步...

  • std::promise使用

    std::promise和std::future配合,可以在线程之间传递数据。 #include #include...

  • c++ 异步(下) future头文件

    future std::future 类型模板是为了等待其他线程上的异步结果,其和 std::promise,st...

  • dart异步

    Dart中的异步 Dart语言的异步编程之Future和async-await是杀手级功能

  • Scala教程之:Future和Promise

    在scala中可以方便的实现异步操作,这里是通过Future来实现的,和java中的Future很相似,但是功能更...

  • Dart语言的异步编程之Future和async-await是杀

    Dart语言的异步编程之Future和async-await是杀手级功能 什么async和await 还记得《Da...

  • 2018-10-23 step

    C++ 11 几个特性的整理 std::future - std::promise 解决的问题 返回值的异步获取:...

  • promise/future异步编程模型

    原文: http://labs.strava.com/blog/futures-in-golang/ promis...

  • Scala 异步编程之 Future

    同步异步,阻塞非阻塞,在IO模型中几个概念组合在一起不是很容易理解,但是只从代码执行的角度看同步异步是很清晰的: ...

网友评论

      本文标题:异步编程之Future和Promise

      本文链接:https://www.haomeiwen.com/subject/jsthyktx.html