Javascript Promise用法详解

时间:2021-05-28

1、约定

  • 本文的 demo 代码有些是伪代码,不可以直接执行。
  • 没有特殊说明,本文所有 demo 都是基于 ES6 规范。
  • Object.method 代表是静态方法, Object#method 代表的是实例方法。如 Promise#then 代表的是 Promise 的实例方法, Promise.resolve 代表的是 Promise 的静态方法.
  • 2、什么是 Promise?

    首先我们来了解 Promise 到底是怎么一回事

    Promise 是抽象的异步处理对象,以及对其进行各种操作的组件。我知道这样解释你肯定还是不明白 Promise 是什么东西,你可以把 Promise 理解成一个 容器,里面装着将来才会结束的一个事件的结果,这个事件通常是一个异步操作。

    Promise最初被提出是在 E语言中, 它是基于并列/并行处理设计的一种编程语言。Javascript 在 ES6 之后也开始支持 Promise 特性了,用来解决异步操 的问题。这里顺便解释一下什么是 ES6, ECMAScript 是 Javascript 语言的国际标准,Javascript 是 ECMAScript 的有一个实现, 而ES6(全称 ECMAScript 6)是这个标准的一个版本。

    3、Javascript 为什么要引入 Promise?

    细心的你可能发现了我刚刚说了 Javascript 支持 Promise 实现是为了解决异步操作的问题。谈到异步操作,你可能会说,Javascript 不是可以用回调 函数处理异步操作吗? 原因就是 Promise 是一种更强大的异步处理方式,而且她有统一的 API 和规范,下面分别看看传统处理异步操作和 Promise 处理 异步操作有哪些不同。

    使用回调函数处理异步操作:

    login("http://ment.json'));// => promise对象promise.then(function(value){ console.log(value);});

    除了上面的方法之外,Promise.resolve方法的参数还有以下三种情况。

    (1). 参数是一个 Promise 实例

    如果参数是Promise实例,那么Promise.resolve将不做任何修改、原封不动地返回这个实例。

    (2). 参数不是具有then方法的对象,或根本就不是对象

    如果参数是一个原始值,或者是一个不具有then方法的对象,则Promise.resolve方法返回一个新的Promise对象,状态为resolved。

    var p = Promise.resolve('Hello');p.then(function (s){ console.log(s)});

    上面代码生成一个新的Promise对象的实例p。由于字符串Hello不属于异步操作(判断方法是字符串对象不具有then方法), 返回Promise实例的状态从一生成就是resolved,所以回调函数会立即执行。 Promise.resolve方法的参数,会同时传给回调函数。

    (3). 不带有任何参数

    Promise.resolve方法允许调用时不带参数,直接返回一个resolved状态的Promise对象。这个我们在上面讲创建 Promise 实例的三种方法的时候就讲过了

    var p = Promise.resolve();p.then(function () { // ...});

    7.5 Promise.reject()

    Promise.reject(reason)方法也会返回一个新的 Promise 实例,该实例的状态为rejected。 需要注意的是,Promise.reject()方法的参数,会原封不动地作为 reject 的理由,变成后续方法的参数。这一点与 Promise.resolve 方法不一致。

    const thenable = { then(resolve, reject) { reject('出错了'); }};Promise.reject(thenable).catch(e => { console.log(e === thenable)})// true

    上面代码中,Promise.reject 方法的参数是一个 thenable 对象,执行以后,后面 catch 方法的参数不是 reject 抛出的“出错了”这个字符串, 而是 thenable 对象。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

    声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

    相关文章