ES5用回调函数拿异步数据,容易造成回调地狱。ES6用then拿回调数据
Promise.prototype.then 方法返回的是一个新的 Promise 对象
let p=new Promise()
p.then()//通过then拿到异步数据,因为resolve()可以将异步数据传递出来
Promise是一个对象,用于表示一个异步操作的最终状态(完成或失败),以及其返回的值。
Promise的状态改变只可能是两种可能:从 Pending 变为 fulfilled 和从 Pending 变为 Rejected。一旦状态发生改变,就不会再变,这也是Promise[承诺]这个名字的由来
Promise构造函数接收一个函数作为参数。该函数也有俩个参数resolve和reject,是有js提供的。并且resolve和reject也是函数。
//resolve可以将异步数据传递出来
let p=new Promise(function(resolve){
resolve("hello world")
})
//因为then方法第一个参数是拿到成功的数据,第二个参数是拿到失败的数据
p.then(function(data){
console.log(data);
})
promise.then((value)=>{
console.log(value)//then方法第一个参数拿到成功的数据
},(error)=>{
console.log(error)//then方法第二个参数拿到返回失败的数据
})
对上面得代码可以再升级使用catch
promise.then((value)=>{
console.log(value)//then方法第一个参数拿到成功的数据
}).catch((error)=>{
console.log(error)//catch方法拿到返回失败的数据
})
//结合上面代码,then方法返回值是Promise,所以catch也是Promise自己的方法
改造喝奶茶函数,使返回一个promise对象
//获取奶茶的方法
function getTea(){
return new Promise(function(resolve){
setTimeout(()=>{
resolve("奶茶")
},1000)
})
}
getTea().then(
function(data){
console.log(data)//这里可以换为箭头函数
}
)
当然还有我们的async和await
async function A(){} //普通函数
let A=async ()=>{} //箭头函数
await后面接promise对象,不再用then获取resolve传出的数据了,await的返回值就是resolve传出的数据。用一个变量去接收
async function getData(){
//直接获取resolve传递出来的异步数据
let hotPot=await getHotpot();
console.log(hotPot);
let tea=await getTea();
console.log(tea);
}