Promise函数详解
Javascript执行环境是单线程的,也就是说JS环境中负责解释和执行的线程只有一个,一次只能完成一项任务,这个任务执行完后才能执行下一个,因此Javascript中存在大量的异步操作和回调函数。
Promise 是异步编程的一种解决方案,是为了解决地域回调问题,比传统的解决方案——回调函数和事件——更合理和更强大。
promise是一个构造函数,new 出来的 Promise 实例对象,代表一个异步操作,自己身上有all、reject、resolve这几个方法,原型上有then、catch等方法。
Promise的状态
Promise对象的状态有3个,分别是pending(进行中)、fulfilled(已完成)、rejected(已失败)。Promise对象一旦进入了某一个状态,就不会再转成其他状态了(主要是后面两种状态,fulfilled和rejected)。如一旦调用了resolve函数,就是fulfilled的状态,就不会再调用reject函数了。
pending:等待状态,比如正在进行网络请求,或者定时器没有到时间。
fulfilled:已成功,当我们回调了resolve函数时,就处于该状态。
rejected:以失败,当我们回调了reject函数时,就处于该状态。
.then和.catch函数注意点:
.then()函数和.catch()都需要Promise对象才能调用,再使用这两个函数的时候,需要注意的地方如下:
1、调用 .then() 方法时,成功的回调函数是必选的,失败的回调函数是可选的。即参数可以为.then(resolve=>{},reject=>{})或.then(resolve=>{}) 这两种。
2、resolve函数返回的是Promise对象,哪怕使用 return ‘bbb’;这样的显式返回,最后也会转成Promise对象返回出去。也可以人工显式指定返回,如以下所示。新返回的Promise对象可以再跟then函数,一直跟下去。如果没有return这条语句,则默认返回对象的参数是undefinded,即res为undefined。
p.then(res => {
console.log('11-' + res);
return 'AAA'; // 相当于Promise.resolve("AAA")
}).then(res => {
console.log('22-' + res);
return new Promise((resolve, reject) => {
resolve(res); // 此处还可以调用reject
})
}).then(res => {
return Promise.resolve(res);
})
3、reject返回的是空,或者说无返回。因为无返回,故后面跟then或catch函数无意义,也不会执行。
let newPromise = new Promise((resolve, reject) => {
setTimeout(() => {
reject('BBB');
},