什么是promise:
Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。(地狱回调)
promise对象的两大特点:
1.对象不受外界的影响
2.一旦状态发生改变,就不会再发生改变,任何时候都能得到这个结果。
getSiginManageHeader: function ({ commit, dispatch },data) { return new Promise((resolve) => { request.getSiginManageHeader(data).then(res => { resolve(res.data) }) }) },
promise对象的状态改变,只有两种可能,一种是变成fulfilled(实现),另一种是变成rejected(驳回),这两种状态
现在的项目中,为了方便,基本上就返回两个值了,一个resolve成功的情况,另一个就是error失败的情况。
做个简单的例子:
new Promise((resolve, reject) => { resolve(1); console.log(2); }).then(r => { console.log(r); }); 出来的值是2,1
这里promise正常运行,打印出2然后resolve给指出去了1,当.then()的方法后,输出console.log(r),r等于1
.then()和.catch():
.then()就是成功后的响应,.catch()就是失败后报错才会走的
promise的机制原理,如果走.then()的话,就一直走.then()。.catch()同理。
promise的.then()和.catch()的顺序没有定义,随便放
Promise.resolve() .catch(function(error) { console.log('错了', error); }) .then(function() { console.log('对了'); });
如果它成功了,就跳过.catch()直接走.then(),如果.then()里面的事件报错的话,还是会走.catch()的
es8里面有个简写方法
promise .finally(() => { // 语句 }); // 等同于 promise .then( result => { // 语句 return result; }, error => { // 语句 throw error; } );
看着就叼。
感觉有用的promise方法all()方法(实际感觉这个方法真没啥用还多写了一步)
const p1 = new Promise((resolve, reject) => { resolve('hello'); }) .then(result => result) .catch(e => e); const p2 = new Promise((resolve, reject) => { throw new Error('报错了'); }) .then(result => result) .catch(e => e); Promise.all([p1, p2]) .then(result => console.log(result)) .catch(e => console.log(e));
看上面的代码,p1方法正确的话走的是resolve,错误的话它还是有catch方法,p2直接走的一个错误方法,走的是自身带的那个catch方法,在最外面的那个all方法,就会一直走的是then()p2的错误在自身的上面就已经把。catch方法走完了,all里面的就相当于一点用都没有。
其实我感觉把,你竟然已经就把p1p2的promise方法都已经弄完了,为啥你还在all一下,我感觉没啥用。
Promise.resolve()方法,将现有对象转为Promise对象
(1)参数是一个Promise对象,他会原封不动的还原回来
(2)参数是一个thenable对象,用上面的方法会转化未promise对象
(3)参实不是一个promise对象,其他值的时候,会返回一个新的promise对象
(4)Promise.resolve()
方法允许调用时不带参数,直接返回一个resolved
状态的 Promise 对象。