首页 > 编程 > JavaScript > 正文

JavaScript-中的Promise使用详解

2019-11-02 14:44:09
字体:
来源:转载
供稿:网友

   这篇文章主要介绍了JavaScript中的Promise使用详解,promise对象是JS进阶学习中的重要知识点,需要的朋友可以参考下

  许多的语言,为了将异步模式处理得更像平常的顺序,都包含一种有趣的方案库,它们被称之为promises,deferreds,或者futures。JavaScript的promises ,可以促进关注点分离,以代替紧密耦合的接口。 本文讲的是基于Promises/A 标准的JavaScript promises。[http://wiki.commonjs.org/wiki/Promises/A]

  Promise的用例:

  执行规则

  多个远程验证

  超时处理

  远程数据请求

  动画

  将事件逻辑从应用逻辑中解耦

  消除回调函数的恐怖三角

  控制并行的异步操作

  JavaScript promise是一个承诺将在未来返回值的对象。是具有良好定义的行为的数据对象。promise有三种可能的状态:

  Pending(待定)

  Rejected(拒绝)

  Resolved(已完成)

  一个已经拒绝或者完成的承诺属于已经解决的。一个承诺只能从待定状态变成已经解决的状态。之后,承诺的状态就不变了。承诺可以在它对应的处理完成之后很久还存在。也就是说,我们可以多次取得处理结果。我们通过调用promise.then()来取得结果,这个函数一直到承诺对应的处理结束才会返回。我们可以灵活的串联起一堆承诺。这些串联起来的“then”函数应该返回一个新的承诺或者最早的那个承诺。

  通过这个样式,我们可以像写同步代码一样来写非同步代码。主要是通过组合承诺来实现:

  堆栈式任务:多处散落在代码中的,对应同一个承诺。

  并行任务:多个承诺返回同一个承诺。

  串行任务:一个承诺,然后接着执行另一个承诺。

  上面几种的组合。

  为什么要这么麻烦?只用基本的回调函数不行吗?

  回调函数的问题

  回调函数适合简单的重复性事件,例如根据点击来让一个表单有效,或者保存一个REST调用的结果。回调函数还会使代码形成一个链,一个回调函数调用一个REST函数,并为REST函数设置一个新的回调函数,这个新的回调函数再调用另一个REST函数,依此类推。代码的横向增长大于纵向的增长。回调函数看起来很简单,直到我们需要一个结果,而且是立刻就要,马上就用在下一行的计算中。

  ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 'use strict'; var i = 0; function log(data) {console.log('%d %s', ++i, data); };   function validate() { log("Wait for it ..."); // Sequence of four Long-running async activities setTimeout(function () { log('result first'); setTimeout(function () { log('result second'); setTimeout(function () { log('result third'); setTimeout(function () { log('result fourth') }, 1000); }, 1000); }, 1000); }, 1000);   }; validate();

  我使用timeout来模拟异步操作。管理异常的方法是痛苦的,很容易玩漏下游行为。当我们编写回调,那么代码组织变得混乱。图2显示了一个模拟验证流可以运行在NodeJS REPL。在下一节,我们将从pyramid-of-doom模式迁移到一个连续的promise。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表