关于Promise入门介绍请看之前文章——Promise入门

        Promise 是异步编程的一种解决方案: 从语法上讲,promise是一个对象,从它可以获取异步操作的消息;从本意上讲,它是承诺,只有异步操作的结果能决定状态,并且一旦状态发生改变就一直保持不会再变。(这与事件不同,事件的特点是一旦错过,再去监听是没有结果的)

(1)创建Promise对象

         Promise  对象,可以将异步操作以同步操作的流程表示,避免回调函数。此外,Promise 对象提供统一的接口,使得控制异步操作更加容易。

        缺点:首先,无法取消 ,一旦新建 Promise  立即执行,无法中途取消;其次,如果不设置回调函数,Promise  内部抛出的错误,不会反应到外部;第三,当处于 Pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。   

const promise = new Promise(function(resolve, reject) {
  // ... some code
  if (/* 异步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});

Promise.resolve(1).then(function(value){
  console.log(value); // 打印出1
}); 
Promise.reject(new Error(“错了”));

(2)Promise方法:then()

        then() 接受两个回调函数作为参数。当 Promise 执行的内容符合成功条件时,调用resolve函数,失败就调用 reject 函数。其中第二个参数可以省略(catch()方法的作用),then方法返回的是一个新的 Promise实例,因此可以链式调用。

let promise = new Promise((resolve,reject)=>{
    //做一些异步操作
    setTimeout(() => {
        console.log('执行完成');
        resolve('我是成功!!');
    }, 2000);
    })
})
promise.then((data) => {
    console.log(data);
})
.then((data) => {
    console.log(data);
})

(3)Promise方法:catch()

        catch() 该方法相当于then方法的第二个参数,指向reject的回调函数;还有一个作用是在执行resolve回调函数时,如果出现错误,抛出异常,不会停止运行,而是进入catch方法中。

p.then((data) => {
     console.log('resolved',data);
},(err) => {
     console.log('rejected',err);
     }
); 
// 上下的等价
p.then((data) => {
    console.log('resolved',data);
}).catch((err) => {
    console.log('rejected',err);
});

(4)Promise方法:all()

        all()方法可以完成并行任务, 它接收一个数组,数组的每一项都是一个 promise对象。当数组中所有的 promise的状态都达到 resolved的时候,all方法的状态就会变成 resolved,如果有一个状态变成了 rejected,那么 all方法的状态就会变成 rejected

let promise1 = new Promise((resolve,reject)=>{
	setTimeout(()=>{
       resolve(1);
	},2000)
});
let promise2 = new Promise((resolve,reject)=>{
	setTimeout(()=>{
       resolve(2);
	},1000)
});

Promise.all([promise1,promise2]).then(res=>{
    console.log(res); //[1,2] 
})

(5)Promise方法:race()

        race() 接受的参数也是一个每项都是 promise的数组,当最先执行完的事件执行完之后,就直接返回该 promise对象的值。如果第一个 promise对象状态变成 resolved,那自身的状态变成了resolved;反之第一个 promise变成 rejected,那自身状态就会变成 rejected

let promise1 = new Promise((resolve,reject)=>{
	setTimeout(()=>{
       reject(1);
	},2000)
});
let promise2 = new Promise((resolve,reject)=>{
	setTimeout(()=>{
       resolve(2);
	},1000)
});
Promise.race([promise1,promise2]).then(res=>{
	console.log(res);
	//结果:2
},rej=>{
    console.log(rej)};
)

(6)Promise方法:finally()

        finally()方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。

promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐