今天面试官问到我这个问题:
面试官:请问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其实并不是主要解决这个问题
如果说只是因为嵌套传统的方法嵌套太多,我觉得叫"嵌套地狱更合适"
还有一个问题就是信任问题。
好了不装了,信任问题,我还在研究,等我弄得比较明白了,再写篇博客记录一下