promise的含义:
是异步编程的一种解决方案
从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。
promise对象特点:
1.对象不受外界影响,除了异步操作结果。
2.一旦状态改变就不会在变,任何时候都可以得到这个结果。
promise缺点:
1.无法取消promise,一旦建成就会立即执行,中途无法取消。
2.如果不用回调函数,promise内部出现的错误不会影响到外部。
3.处于pending状态时,无法得知目前进展到哪一个阶段。
promise用法:
Promise对象是一个构造函数,用来生成Promise实例。
构造函数有两个参数:resolve(成功之后的回调函数)
reject(失败之后的回调函数)
const p1 = new Promise(function(resolve,reject){
resolve('success3');
reject('reject');
});
promise生成后,可以用then方法分别指定resolved和rejected的回调函数。
promise.then(function(value) {
// success
}, function(error) {
// failure
});
then的方法:
then方法可以接受两个回调函数作为参数。
- promise对象变为resolved时调用。
- promise对象变为rejected时调用。
Promise.prototype.then方法:链式操作
promise.prototype.then 返回一个新的promise对象,为 Promise 实例添加状态改变时的回调函数
getJSON("/posts.json").then(function(json) {
return json.post;
}).then(function(post) {
// proceed
});
Promise.prototype.catch方法:捕捉错误
Promise.prototype.catch 方法是 Promise.prototype.then(null, rejection) 的别名,用于指定发生错误时的回调函数。
getJSON('/posts.json').then(function(posts) {
// ...
}).catch(function(error) {
// 处理 getJSON 和 前一个回调函数运行时发生的错误
console.log('发生错误!', error);
});
Promise.prototype.finally()
finally()方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。
promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});
Promise.all方法
Promise.all 方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。
var p = Promise.all([p1,p2,p3]);
Promise.race方法
Promise.race 方法也是将多个 Promise 实例,包装成一个新的 Promise 实例。
var p = Promise.race([p1,p2,p3]);
Promise.allSettled()
Promise.allSettled()方法接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例。
const promises = [
fetch('/api-1'),
fetch('/api-2'),
fetch('/api-3'),
];
await Promise.allSettled(promises);
removeLoadingIndicator();
Promise.any()
Promise.any()方法接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例。
const promises = [
fetch('/endpoint-a').then(() => 'a'),
fetch('/endpoint-b').then(() => 'b'),
fetch('/endpoint-c').then(() => 'c'),
];
try {
const first = await Promise.any(promises);
console.log(first);
} catch (error) {
console.log(error);
}
Promise.resolve 方法
有时需要将现有对象转为Promise对象,Promise.resolve方法就起到这个作用。
var jsPromise = Promise.resolve($.ajax('/whatever.json'));
promise.resolve有四种参数:
- 如果参数是promise实例,promise.resolve将不做任何修改、原封不动的返回这个实例。
- thenable对象 就是具有then方法的对象。
let thenable = {
then: function(resolve, reject) {
resolve(42);
}
};
实例:
let thenable = {
then: function(resolve, reject) {
resolve(42);
}
};
let p1 = Promise.resolve(thenable);
p1.then(function(value) {
console.log(value); // 42
});
- 参数不具有then方法的对象,或者不是对象
const p = Promise.resolve('Hello');
p.then(function (s){
console.log(s)
});
// Hello
- 不带任何参数
const p = Promise.resolve();
p.then(function () {
// ...
});
Promise.reject()方法
Promise.reject()方法也会返回一个新的 Promise 实例,该实例的状态为rejected。
const p = Promise.reject('出错了')
p.then(null, function (s) {
console.log(s)
});
// 出错了