闽公网安备 35020302035485号
小金今天刚敲完代码,就收到了一条短信:你就和我在一起吧,我Promise以后会让你幸福的。原来是他的房东又向他抛来了橄榄枝,小金听完这个Promise,赶紧收拾行李,连夜跑回(.then)老家,此时不走更待何时。让我们一起走进今天的分享,Promise如何解回调地狱的。
var a = 1
setTimeout(()=>{
a = 2
},1000)
console.log(a);
答案是:1,在箭头函数执行之前,v8已经将所有的同步函数执行完毕了,然后再修改的a的值为2。简单的理解了这个之后,我们直接上强度!
function a (cbB,cbC,cbD){
cbB(cbC,cbD)
}
function b (cb,cbD){
cb(cbD)
}
function c (cb){
cb()
}
function d (){}
a(b,c,d)
a函数接受三个回调参数:cbB、cbC和cbD。cbB实际上为b函数,它又接收 cb 和 cbD 参数。cb 参数实际上是指向 c 函数的引用,它接收一个回调参数 cb 并立即调用它。cbD 参数是指向 d 函数的引用,它没有参数。如果觉得已经转不过来了,那么直接请上我们的Promise老祖!
Promise是一个异步编程模式,主要用于处理异步操作,如果将上述的程序理解为函数a的执行需要函数b的拿到数据,函数b的执行需要函数c拿到的数据......这样的场景在现实开发中是很常见的,Promise提供了一种更优雅的方式来组织和处理非阻塞的异步代码,可以更加合理和强大的代替回调函数的方式。
promise
.then((result) => {
console.log(result);
})
.catch((error) => {
console.error(error);
});
注: then()方法是在Promise的原型对象上的,只有Promise对象才有这个方法。Promise的链式调用,以相亲的实例来体验一下吧,彭于晏们function xq(){
return new Promise((resolve,reject)=>{ //{status:Fulfilled}
setTimeout(() => {
console.log('你要相亲了');
resolve()
}, 2000);
})
}
// 堆代码 duidaima.com
function marry(){
return new Promise((resolve,reject)=>{
setTimeout(() => {
console.log('你们结婚了');
resolve()
}, 1000);
})
}
function baby(){
console.log('孩子出生了');
}
xq().then(()=>{
return marry()
})
.then(()=>{
baby()
})
这种模式更加直观和流畅的展现了异步操作的流程,但是特别注意的是,then方法会默认返回一个Promise对象,状态为pending,如果你没有主动返回marry中的Promise的话,第一个then默认返回的Promise对象会继承前一个Promise的结果或错误,也就是不等marry执行完,就会先一步执行。你可以通过resolve()和reject()调用传递参数(请求到的数据、错误信息),和改变Promise的状态。function a(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
console.log('a is ok');
resolve('请求到的数据')
},1000)
})
}
a()
.then((res)=>{
console.log(res,'11111111');
})
Promise变为reject状态function a(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
console.log('a is ok');
reject('no')
},1000)
})
}
a()
.then((res)=>{
console.log(res,'11111111');
})
.catch((err)=>{
console.log(err,"xxxxxxxxxxx");
})
接下来!我们用Promise解决一下刚刚的回调小地狱吧!!!function a() {
return new Promise((resolve) => {
resolve(b());
});
}
function b() {
return new Promise((resolve) => {
resolve(c());
});
}
function c() {
return new Promise((resolve) => {
resolve(d());
});
}
function d() {
// 这个函数可以返回任何你想返回的结果
return "Result from D";
}
// 使用 Promise 链式调用
a()
.then(() => b())
.then(() => c())
.then(() => d())
.then((result) => {
console.log(result); // 输出 "Result from D"
})
是不是感觉柳暗花明又一村了呢~~~