1.什么是Promise?
Promise是异步编程的一种解决方案,它是一个异步操作的容器.
当有异步操作时,使用Promise对这个异步操作进行封装.
new Promise(function(resolve,reject){
new ->构造函数(1.保存一些状态信息 2.执行传入的函数)
resolve与reject是回调函数中的两个参数,但是resolve和reject本身又是一个函数.当异步操作成功时,调用resolve函数参数;当异步操作失败时,调用reject函数参数
})
new Promise(function(resolve,reject){
setTimeout(function(){
.....执行异步操作内容
如果操作成功 resolve(操作成功后需要返回的信息)
如果操作失败 reject(操作失败后需要返回的信息)
})
}).then(function(res){
....res表示操作成功后调用resolve函数传递过来的信息
}).catch(function(err){
...err表示操作失败后调用reject函数参数传递过来的信息
})
1.5.如何创建Promise对象并添加异步任务
Promise对象通过使用构造函数Promise来创建,并且需要接收一个执行函数(executor)(即回调函数), 这个函数内包含了初始化Promise的一些代码.该执行函数接收 resolve 和 reject 两个参数(其实是两个函数)。
resolve 函数会在执行函数成功运行后发出信号表示该 promise 已经可用。
reject 函数代表该执行函数运行失败。
new Promise(function(resolve,reject){
...初始化Promise的代码.
if(异步任务成功){
resolve(异步任务成功的信息);
}else{
reject(异步任务失败的信息)
}
})
2.Promise的三种状态(生命周期)
pending:等待状态,即正在进行网络请求,或者定时器还没有达到触发时间的这段时间
fulfill:满足状态(成功),当我们主动回调了resolve()时,就处于该状态,并且会回调.then()。
reject:拒绝状态(失败),当我们主动回调了reject()时,就处于该状态,并且会回调.catch()。
2.5.Promise的resolve()方法调用知识改变了状态,当调用过resolve()方法后,其他的resolve()方法就不再运行.
即:多个resolve()方法调用,只会运行第一个resolve()方法.
例如:
new Promise((resolve,reject)=>{
//这里只会调用resolve(1),resolve(2)不会进行调用.
resolve(1);
resolve(2);
})
3.Promise链式调用
每次调用then方法会返回一个全新的Promise对象
new Promise((resolve,reject)=>{
setTimeout(()=>{
//进行异步操作
let flag=true,
let data='异步信息'
let err='错误信息'
if(flag){
resolve(data)
}else{
reject(err)
}
},1000)
}).then((res)=>{
console.log(res)
return new Promise((resolve,reject)=>{
......
})
})
4.关于.then()方法返回的Promise
then方法总是返回一个新的Promise,而它的行为与then中的回调函数的返回值有关:
如果then中的回调函数返回一个值,那么then返回的Promise将会成为接受状态,并且将返回的值作为接受状态的回调函数的参数值。
如果then中的回调函数抛出一个错误,那么then返回的Promise将会成为拒绝状态,并且将抛出的错误作为拒绝状态的回调函数的参数值。
如果 then 中的回调函数返回的是一个 promise A, 那么then返回的promise B的状态始终会与 promise A 保持一致. 并且回调函数的参数值也始终相同.promise A的回调函数的参数也始终与 promise B的回调函数的参数保持一致.
5.Promise的语法糖:async、await
async用于声明一个function 是异步的,而await用于获取async声明的方法中的数据(因此await只能在async声明的function中使用)
async 就是异步的意思,使用关键字 async声明异步函数.异步函数默认返回一个成功状态的promise.也可以在异步函数中添加return "abc"语句, 则会把这个值封装成 Promise.resolve("abc");
如果想返回一个reject的Promise则可以在函数内部抛出一个异常即可.
异步函数有如下变体:
异步函数声明:async function foo(){}
异步函数表达式:const foo = async function(){}
异步方法定义:let obj = { async foo(){} }
异步箭头函数:const foo = async () => {}
简单使用async,异步函数总是返回Promises对象
async function testAsync(){
return '哈哈'
}
console.log(testAsync()) ;//Promise {<resolved>: "哈哈"}
testAsync().then((res)=>{ //获取该Promise对象中的数据
console.log(res)
})
异步函数执行的结果总是一个promise,这个promise在异步函数开始执行的时候被创建。
然后函数体被执行,执行可能会通过return或throw永久完成,或者通过await临时完成(这种情况,之后会继续执行)。
promise被返回。
当执行异步函数体的时候,return x将会resolve(x),throw err将会reject(err),promise的完成是异步的。换句话说,then(),catch()中的回调函数总是在当前代码完成之后执行。
await是等待的意思,在等待一个异步任务的完成. 它可以将一个异步函数变为同步函数.一般是等待一个 Promise resolve. 当然可以等任何其他的值.
await 会等待, 等到Promise resolve之后, 他的运算的最终结果是resolve(值)中的值
调用async函数虽然有等待, 但是并不会导致阻塞, 因为他内部的所有阻塞都封装在Promise对象中异步执行.
注意: 操作符await(只能在async函数中使用)等待其操作数(promise)被完成
若Promise被resolve,则其await的值就是resolve的值
若Promise被reject,则await抛出reject的值
例如:
async function getAy(){
let value=await getNum(5);
}
6.获取async声明的function中数据的方法
方法一:
//通过调用方法
async function getData(){
let name='白骨精';
return name;
}
const p=getData();
p.then(res=>{
console.log(res)
})
方法二:
// 声明一个异步函数
async function getData(){
let name='白骨精';
return name;
}
// 在一个异步函数中调用另一个异步函数
async function getName(){
let name=await getData()
console.log(name)
}
//调用方法
getName()