Promise 是异步编程的一种解决方案,比传统的解决方案—回调函数和事件—更合理和更强大。
Promise是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
语法上,Promise 是一个对象,从它可以获取异步操作的消息。
Promise 提Promise对象的特点供统一的 API,各种异步操作都可以用同样的方法进行处理。
Promise对象的特点
1.Promise有三种状态:pending、fullfilled、rejected。分别表示进行中、已完成和已失败。
2.Promise的状态有pending改变为fullfilled或rejected后就不会再改变。
3.Promise中传递一个执行器函数,在执行器函数中调用resolve和reject方法可以讲Promise的状态改为fullfilled或rejected。并且可以通过then方法来处理成功的数据,通过catch来抛出错误的原因。
异步编程与Promise的关系
由于代码址行顺序是由执行栈空->微任务队列->宏任务,如果将异步任务和处理异步获取到的数据的代码放在同一代码块内,会导致数据还未拿到就开始请求。使用Promise就可以避免这个问题。我们通常讲异步任务放在Promise的执行器函数中,并通过数据请求情况调用Promise的resolve和reject函数来改变Promise的状态。再通过then方法处理请求成功的数据,通过catch抛出请求失败的原因。
Promise的用法
1.通过new Promise关键词创建promise对象吗,并且传入一个执行器函数,执行器函数中传入resolve和reject方法,通过调用这两种方法改变Promise的状态。
2.then方法,Promise对象的then(onfulfilled, onrejected)方法会返回一个新的Promise对象。 then方法中onfulfilled回调函数会作为新Promise对象构造时的执行器函数,且其返回值作为新Promise对象fulfilled状态下的结果,即value值。 该value值会传递给新Promise对象的then()方法中的onfulfilled回调函数。 同理,如果then方法中onfulfilled函数发生错误,则会将新Promise对象的状态定型为rejected。
3.Promise.resolve()方法
如果Promise.resolve()传入值,就将生成新的Promise对象,并将该值作为成功的参数。
如果Promise.resolve()传入的是一个Promise对象,则该实例将被直接返回。
console.log("我是一个粉刷匠");
Promise.resolve("我要把那小房子").then((value) => {
console.log(value);
}); //直接传值,resolve会返回一个promise对象,并将值传入
const p = new Promise((resolve, reject) => {
resolve("刷的更漂亮");
});
const p1 = Promise.resolve(p);
const p2 = Promise.resolve(p).then((value) => {
console.log(value);
}); //传promise对象,则将这个对象返回,并将这个promise对象的value传入
console.log(p == p1); //resolve返回的promise
console.log(p == p2); //then返回的promise
console.log("粉刷本领强");
4.当需要将多个Promise任务一起执行时,可以使用Promise.all( )方法。
Promise.all( )实参是所有Promise实例的字面量组成的数组,执行完毕的结果是所有输出结果的所组成的数组。
5。Promise.race(iterable) 方法,iterable为包含了多个promise对象的可迭代数据结构,如数组。
哪一个Promise状态先改变就输出谁的结果。
async/await
async函数返回的Promise对象会运行执行(resolve)异步函数的返回结果,或者如果异步函数抛出异常的话会运行拒绝(reject)。
async会把返回值传递给Promise.resolve( )。
异步函数可以包含await指令,该指令会暂停异步函数的执行,并等待Promise执行,然后继续执行异步函数,并返回结果。 如果等待的不是 Promise 对象,则返回该值本身。 await 关键字只在异步函数内有效。