Promise:在英文中有承诺的意思,是进行异步编程新的解决方案。在以往都是采用纯回调的方式,在我的博客可以看看,之前没有Promise时会造成回调地狱,回调地狱就是由于纯回调引起的嵌套,一层一层缩进:
如何解决回调地狱的问题——Promise,async,await_那只猫喝咖啡的博客-CSDN博客
首先Promise不是回调函数,是一个内置的构造函数,需要我们new 调用:
const p=new Promise((resolve,reject)=>{此处放异步任务})
resolve,reject 这两个参数是用来改变Pormise实例的状态。
状态的改变只有两种:
1.pending=>fulfilled 由进行中到成功
2.pending=>rejected 由进行中到失败
而Promise的状态是有三种的:
1.pending 初始状态:是非成功非失败的状态
2.fulfilled 成功状态
3.rejected 失败状态
接下来举个例子:
function fun(name) {
const p = new Promise((resolve, reject) => {
var flag=true
setTimeout(() => {
if(flag){
// 如果符合符合某些条件就将promise的状态由初始状态更改为成功
resolve(name)
}else{
// 如果不符合符合某些条件就将promise的状态由初始状态更改为失败
reject()
}
},1000)
})
return p
}
// fun的返回值是一个promise实例对象,.then方法是为promise实例对象指定成功和失败的回调
fun('李白')
setTimeout是一个异步任务。意思大概是当符合某些条件promise的状态就会变为成功/失败,
而.then方法就是为Promise实例(p)指定的成功或失败的回调,一旦调用的是resolve说明状态变为成功,就会做出成功所用到的业务逻辑,失败也是如此。
p.then(
(response)=>{成功所要写的业务逻辑},
(reason)=>{失败所要写的业务逻辑}
)
代码整体结构如下:
<script>
function fun(name) {
const p = new Promise((resolve, reject) => {
var flag=true
setTimeout(() => {
if(flag){
// 如果符合符合某些条件就将promise的状态由初始状态更改为成功
resolve(name)
}else{
// 如果不符合符合某些条件就将promise的状态由初始状态更改为失败
reject()
}
},1000)
})
return p
}
// fun的返回值是一个promise实例对象,.then方法是为promise实例对象指定成功和失败的回调
fun('李白')
.then((response)=>{
console.log("我得到了一个人的名字:",response) //执行到这里时说明已经执行成功了,
},(reason)=>{console.log(reason)})
</script>
运行结果如下:
我们将不同的console.log("111111")放在其后面却发现最后输出的时候是在前面,由此可得,这是一个异步操作
Promise的优势
1.灵活:它不需要在定义时就要想好成功和失败应该做出什么逻辑,而是使用then()方法,想调用时再调用,相对来说比较灵活。
2.解决了回调地狱:详情请看如何解决回调地狱的问题——Promise,async,await_那只猫喝咖啡的博客-CSDN博客