该文章完全按照我的理解,如有错误欢迎指正
什么是promise:
promise的状态分为:
等待 默认值
完成 .then
失败 .catch
promise是解决异步编程的最终方案,我们想象一个场景,当你有一个需求需要通过xhr发送接口获取到数据,然而数据是需要通过接口a返回的参数调用接口b,再通过接口b返回的数据调用接口c获取到最终数据,如果没有promise,那绝大部分解决方法就是通过回调函数来解决这个问题,但是如果函数层级过高,并不利于代码阅读,也就是所谓的回调地狱
promise通过链式调用的方法可以解决这个问题,并提供了一些api更加方便我们的开发编程(all,race,finally,allSettled等等),到了es7更是出现了async和await语法糖,使我们异步操作更加得心应手,不过需要注意的是因为太方便了,使用await并不能捕获到错误,可以通过try catch 或者自己封装一个捕获错误的函数例如:
export function to(promise, errorExt) {
return promise
.then(function(data) {
return [null, data];
})
.catch(function(err) {
if (errorExt) {
Object.assign(err, errorExt);
}
return [err, undefined];
});
}
promise不止于此还有更多的应用场景
例如:我有四五个接口需要都返回数据后,再执行下面的代码
例如:我有个表单页面,提交需要依赖一个接口的参数,这是需求
但是该接口返回很慢,我在刚进入表单页面时就已经调用该接口了,但是有可能点击提交时,接口还没有返回给我参数,就会产生错误,那该如何完美解决该问题,必须要刚进来就要加载。
我想到的方案有两个:
1:定义一个布尔,默认false,接口请求完成后改为true,来控制提交按钮的点击
2:使用promise,创建一个p = new Promise实例,状态默认为等待,当接口返回数据后,通过resolve函数,状态变成完成,在点击提交时,将提交的代码放到p.then中,等待完成就行,中间可以加个loading啥的
但是这个例子还是第一个比较合适,简单,第二个只是举例promise的应用场景