Promise搞不懂,看这篇就明白了
Promise 是异步编程的一种解决方案,实质上Pomise是个对象,用来封装异步操作,可以更加优雅的书写复杂的异步任务。
具体来看他是怎么工作的:
Promise语法格式
new Promise(function (resolve, reject) {
// resolve 表示成功的回调
// reject 表示失败的回调
}).then(function (res) {
// 成功的函数
}).catch(function (err) {
// 失败的函数
})
//第二种写法
const promise = new Promise((resolve,reject)=>{})
promise.then((res)=>{
//成功执行的函数
console.log('success',res);
}).catch((err)=>{
//失败执行的函数
console.log('fail',err);
})
出现了new关键字,就明白了Promise对象其实就是一个构造函数,是用来生成Promise实例的。能看出来构造函数接收了一个函数作为参数,该函数就是Promise构造函数的回调函数,该函数中有两个参数resolve和reject,这两个参数也分别是两个函数!
举个栗子:
有个异步函数setTimeout,1秒之后执行,返回成功的状态。
const promise = new Promise((resolve,reject)=>{
setTimeout(() => {
resolve(" excute sucess!")
}, 1000);
})
promise.then((res)=>{
console.log("success", res)
}).catch((error)=>{
console.log("failed",error)
})
控制台获取到的信息:
resolve函数的目的是将Promise对象状态变成成功状态,在异步操作成功时调用,将异步操作的结果,作为参数传递出去。进入then中执行,
进一步看,如果resolve参数是一个函数,则需要这个函数有返回值,否则res得到的会是undefined
function HandleSuccess(){
msg.value=100
return msg.value
}
const promise = new Promise((resolve,reject)=>{
setTimeout(() => {
resolve(HandleSuccess())
}, 1000);
})
promise.then((res)=>{
console.log("success", res)
}).catch((error)=>{
console.log("failed",error)
})
当resolve的参数是一个函数,但是没有返回值时,promise当然也获取不到返回值,是undefined
function HandleSuccess(){
msg.value=100
}
const promise = new Promise((resolve,reject)=>{
setTimeout(() => {
resolve(HandleSuccess())
}, 1000);
})
promise.then((res)=>{
console.log("success", res)
}).catch((error)=>{
console.log("failed",error)
})
当拒绝承诺时,则会进入catch中:
function HandleError(){
console.log("error ")
msg.value="warning"
return msg.value;
}
const promise = new Promise((resolve,reject)=>{
setTimeout(() => {
reject(HandleError())
}, 1000);
})
promise.then((res)=>{
console.log("success", res)
}).catch((error)=>{
console.log("failed",error)
})
下方图可以快速理解:Promise对象中自带两个方法then和catch,这两个方法会分别再传入一个回调函数,这个回调函数的目的在于返回你所需要成功或失败的信息,
Promise链式
then方法返回的是一个新的Promise实例(注意:不是原来那个Promise实例)。因此可以采用链式写法,即then方法后面再调用另一个then方法,在then方法内调用return语句,会像构造函数里的resolve或者reject函数一样,把结果传递给下一个then方法内的函数。请看以下示例:
new Promise((resolve,reject)=>{
console.log("start first request")
setTimeout(() => {
var data={name:"jack",value:'22'}
resolve(data)
}, 1000);
}).then(res=>{
console.log('获取第一个的结果',res)
return res.name;
}).then(res=>{
console.log('获取第二个的结果',res)
})
在前端的项目开发中还是在前端的面试过程中,Promise的地位就是举足轻重的,虽然解决异步编程的终极解决方案是async和await,但是它们也是基于Promise封装而来的,所以我们要了解它,需要经常去思考,有问题的欢迎补充。