在JS的异步编程中Promise是一个很重要的的对象。Promise 是一个 ECMAScript 6 提供的类,目的是更加优雅地书写复杂的异步任务。在语法上Promise是一个对象,从它可以获取异步操作的消息,用于表示一个异步操作的最终完成 (或失败)及其结果值。
Promise对象代表一个异步操作,一共有3种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。Promise对象支持俩个属性:state和result。当Promise对象处于“pending”时,结果为undefined。当Promise对象“fulfilled”时,结果是一个值,当一个Promise对象是“rejected”时,结果是一个错误对象。
Promise。then()有俩个参数,一个是成功时的回调,另一个是失败时的回调。俩者都可以选,所以我们可以为成功或者失败添加回调。用通俗的话来说就是通过对then()的结果进行判断来对哪个函数进行调用。
这个图就形象的表达了Promise.then()的用法
同时Promise构造函数在JS中也经常用于创建Promise对象的内置函数。Promise 构造函数接受一个函数作为参数,该函数是同步的并且会被立即执行,所以我们称之为起始函数。起始函数包含两个参数 resolve 和 reject,分别表示 Promise 成功和失败的状态。
起始函数执行成功时,它应该调用 resolve 函数并传递成功的结果。当起始函数执行失败时,它应该调用 reject 函数并传递失败的原因。
Promise 构造函数返回一个 Promise 对象,该对象具有以下几个方法:
1.then:用于处理Promise成功状态的回调函数。
2.catch:用于处理Promise失败状态的回调函数。
3.finally:无论Promise是失败还是成功,都会执行的回调函数。
Promise 类有 .then() .catch() 和 .finally() 三个方法,这三个方法的参数都是一个函数,.then() 可以将参数中的函数添加到当前 Promise 的正常执行序列,.catch() 则是设定 Promise 的异常处理序列,.finally() 是在 Promise 执行的最后一定会执行的序列。 .then() 传入的函数会按顺序依次执行,有任何异常都会直接跳到 catch 序列:
其执行结果为
async 属性是一个布尔属性。async 属性可以用于控制脚本的异步加载,并在加载完成后立即执行(异步加载,同步执行)。
当 <script> 标签设置了 async 属性时,浏览器会异步地加载脚本文件,并且在下载完成后立即执行脚本,而不会等待页面的渲染。这样可以避免脚本的下载和执行对页面渲染的阻塞,从而提高页面的加载速度。需要注意的是由于 async 属性的设置会使得脚本的执行顺序不再保证,因此在编写代码时需要注意脚本之间的依赖关系。如果多个脚本之间有依赖关系,需要使用 defer 属性或者手动管理加载顺序来确保脚本的正确执行顺序。并且async 属性仅适用于外部脚本(只有在使用 src 属性时)。
await 操作符用于等待一个 Promise 对象, 它只能在异步函数 async function 内部使用。
正常情况下,await 命令后面是一个 Promise 对象,它也可以跟其他值,如字符串,布尔值,数值以及普通函数。
await针对所跟不同表达式的处理方式:
1.Promise 对象:await 会暂停执行,等待 Promise 对象 resolve,然后恢复 async 函数的执行并返回解析值。
2.非 Promise 对象:直接返回对应的值。