在JavaScript开发中,有时遇到异步操作,在代码写成的历程中,四处都充斥着回调函数嵌套,很容易就陷入“回调地狱”。为了让代码更清晰,易于阅读,提高开发效率,ES6提出了Promise的看法。
Promise是一种异步编程解决方案,它是对回调函数的一种替换,可以通过链式挪用,更优雅地处置异步操作。Promise有三种状态:pending(举行中)、fulfilled(已乐成)和rejected(已失败),状态一旦改变,就不会再变了。通过then方式可以设置回调函数,当Promise的状态改变时自动执行响应的回调函数。
以下是Promise的简朴使用方式:
let promise = new Promise((resolve, reject) => { // 异步操作代码 if (异步操作乐成) { resolve(乐成返回的数据); } else { reject(失败返回的缘故原由); }});promise.then((data) => { // 乐成返回时的操作}).catch((reason) => { // 失败返回时的操作});
在上面代码中,Promise工具接受一个函数作为参数,该函数的两个参数划分为resolve和reject,划分示意异步操作乐成时的回调函数和异步操作失败时的回调函数。当异步操作乐成时,挪用resolve并将乐成的结果作为参数转达进去;当异步操作失败时,挪用reject并将失败的缘故原由作为参数转达进去。通过promise.then和.catch方式,可以划分设置Promise的乐成和失败的回调函数。
Promise还可以通过Promise.all方式,同时执行多个Promise工具,当所有Promise工具都乐成后,返回结果才是乐成;当其中随便一个Promise工具失败,返回结果即为失败。
下面是一个Promise.all的例子:
let promise1 = Promise.resolve(1);let promise2 = Promise.resolve(2);let promise3 = new Promise((resolve, reject) => { setTimeout(resolve, 100, 3);});Promise.all([promise1, promise2, promise3]).then(values => { console.log(values); //[1, 2, 3]});
在上面代码中,Promise.all同时执行promise1、promise2和promise3,当3个Promise工具都乐成时,才会执行回调函数并输出结果。
通过Promise的方式,可以更好地治理代码,制止回调函数嵌套,让JavaScript更精练高效。