ES6 promise

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)
});
// 出错了
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容