JS Promise 解决了什么问题? 如何解决-学习记录

博客探讨了Promise如何通过链式调用来解决回调地狱,使得异步操作更加清晰。同时,提到了Promise并未完全解决信任问题,指出这需要进一步研究。文章通过代码示例对比了传统回调和Promise的实现方式,并解释了Promise内部状态转换的原理。
摘要由CSDN通过智能技术生成

今天面试官问到我这个问题:

面试官:请问Promise解决了什么问题。

我:Promise解决了回调地狱的问题,比如说我们购物时,先获取商品信息,再下单,再付款,再显示订单信息,这个过程每一步都依赖上一步的返回的数据,那么在之前的话需要不停的嵌套回调。

面试官: 那你说说Promise 是如何解决这个问题的。

我:啊,那啥,啊吧啊吧.......

面试官:行,好,嗯,那我们下一道题。

问题:

我们先针对上述问题做个解答

传统方法:

// 我们以TimeOut模拟网络异步请求
// 假设C请求依赖B的数据,B请求依赖A的数据
// 执行顺序为 A -> B -> C

setTimeout(()=>{
    let resA = 'A请求的响应数据'
    console.log(resA)
    setTimeout(()=>{
        let resB = "B请求的响应数据"
        console.log(resB)
        setTimeout(()=>{
            let resC = "C请求的响应数据"
            console.log(resC)
        }, 3000)
    }, 2000)
},1000)

三个请求,依次依赖上一步的数据,而且还不包括逻辑判断、异常处理、插入同步任务等逻辑。

代码显得非常混乱(我们称为回调地狱,当然回调地狱最重要还有个问题是信任问题,晚点说)

Promise 方法

// 我们以TimeOut模拟网络异步请求
// 假设C请求依赖B的数据,B请求依赖A的数据
// 执行顺序为 A -> B -> C

let testP = new Promise(resolve => {
    // A请求
    setTimeout(()=>{
        console.log('A请求响应的数据')
        resolve()
    },1000)
})

testP.then(()=>{
    return new Promise(resolve => {
        // B请求
        setTimeout(()=>{
            console.log('B请求响应的数据')
            resolve()
        },1000)
    })
}).then(()=>{
    return new Promise(resolve => {
        // C请求
        setTimeout(()=>{
            console.log('C请求响应的数据')
            resolve()
        },1000)
    })
})

为什么可以这样做

因为Promise的实例中的then方法会默认返回一个新的Promise实例

那么这个新实例的状态如何决定呢

let P = Promise.resolve("OK")

let res = P.then(()=>{
    
})

console.log(res) //最终结果为resolved


let P = Promise.resolve("OK")

let res = P.then(()=>{
    throw 'err'
})

console.log(res) // 最终结果为reject ,且值为err

let P = Promise.resolve("OK")

let res = P.then(()=>{
    return 1
})

console.log(res) // 最终解析结果为resolved  ,且值为1

let P = Promise.resolve("OK")

let res = P.then(()=>{
    return new Promise(resolve => {
        resolve()
    })
})

console.log(res)

 最后一个代码块,直接返回了一个新的Promise实例

所以可以继续.then进行下一步的操作。

然而Promise其实并不是主要解决这个问题

如果说只是因为嵌套传统的方法嵌套太多,我觉得叫"嵌套地狱更合适"

还有一个问题就是信任问题。

好了不装了,信任问题,我还在研究,等我弄得比较明白了,再写篇博客记录一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值