这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战
!
定义:
Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。
所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。
Promise有几种状态?
有三种状态:pending
(进行中)、fulfilled
(已成功)和rejected
(已失败)
举个例子 :
let HelloPromise = new Promise((resolve, reject) => {
// code
resolve('success')
// code
reject('failed')
})
HelloPromise.then((res) => {
console.log(res)
}, (result) => {
console.log(res)
})
复制代码
Promise的状态是否可变?
不可变
1.对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。
2.一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
Promise方法:
then
then方法返回的是一个新的 Promise 实例.(注意, 不是原来那个Promise实例), 因此可以采用链式写法, 即 then 方法后面再调用另一个 then 方法.
getData('/getDataTable').then(function(json) {
return data;
}).then(function(post) {
// ...
});
复制代码
catch
Promise.prototype.catch()方法是.then(null, rejection)或.then(undefined, rejection)的别名,用于指定发生错误时的回调函数。
例:
getData('/getDataTable').then(function(posts) {
// ...
}).catch(function(error) {
// 处理 getData 和 前一个回调函数运行时发生的错误
console.log('发生错误!', error);
});
复制代码
finally
finally()
方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。该方法是 ES2018 引入标准的。
promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});
复制代码
all
Promise.all方法用于将多个 Promise 实例,包装成一个新的 Promise 实例
const promises = [2, 3, 5, 7, 11, 13].map(function (id) {
return getJSON('/post/' + id + ".json");
});
Promise.all(promises).then(function (posts) {
// ...
}).catch(function(reason){
// ...
});
复制代码
上面代码中,promises
是包含 6 个 Promise 实例的数组,只有这 6 个实例的状态都变成fulfilled
,或者其中有一个变为rejected
,才会调用Promise.all
方法后面的回调函数。
race
Promise.race()方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例
const p = Promise.race([
fetch('/resource-that-may-take-a-while'),
new Promise(function (resolve, reject) {
setTimeout(() => reject(new Error('request timeout')), 1000)
})
]);
p
.then(console.log)
.catch(console.error);
复制代码
上面代码中,如果 1 秒之内fetch方法无法返回结果,变量p
的状态就会变为rejected,从而触发catch方法指定的回调函数