ES6之Promise对象

系统管理员 2022-12-14 13:53 316阅读 0赞

Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。

resolve() 状态成功->then(),reject()捕捉错误 ->catch()

一旦状态改变,就不会再变。

  1. Promise对象实现的 Ajax 操作的例子。
  2. const getJSON = function(url) {
  3. const promise = new Promise(function(resolve, reject){
  4. const handler = function() {
  5. if (this.readyState !== 4) {
  6. return;
  7. }
  8. if (this.status === 200) {
  9. resolve(this.response);
  10. } else {
  11. reject(new Error(this.statusText));
  12. }
  13. };
  14. const client = new XMLHttpRequest();
  15. client.open("GET", url);
  16. client.onreadystatechange = handler;
  17. client.responseType = "json";
  18. client.setRequestHeader("Accept", "application/json");
  19. client.send();
  20. });
  21. return promise;
  22. };
  23. getJSON("/posts.json").then(function(json) {
  24. console.log('Contents: ' + json);
  25. }, function(error) {
  26. console.error('出错了', error);
  27. });

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

  1. promise
  2. .then(result => {···})
  3. .catch(error => {···})
  4. .finally(() => {···});

finally方法的回调函数不接受任何参数,这意味着没有办法知道,前面的 Promise 状态到底是fulfilled还是rejected。这表明,finally方法里面的操作,应该是与状态无关的,不依赖于 Promise 的执行结果。

Promise.all()用于将多个 Promise 实例,包装成一个新的 Promise 实例。

  1. const p = Promise.all([p1, p2, p3]);

(1)只有p1p2p3的状态都变成fulfilledp的状态才会变成fulfilled,此时p1p2p3的返回值组成一个数组,传递给p的回调函数。

(2)只要p1p2p3之中有一个被rejectedp的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。

Promise.race()只要p1p2p3之中有一个实例率先改变状态,p的状态就跟着改变.

Promise.allSettled() 只有等到所有这些参数实例都返回结果,不管是fulfilled还是rejected,包装实例才会结束。

  1. const resolved = Promise.resolve(42);
  2. const rejected = Promise.reject(-1);
  3. const allSettledPromise = Promise.allSettled([resolved, rejected]);
  4. allSettledPromise.then(function (results) {
  5. console.log(results);
  6. });
  7. // [
  8. // { status: 'fulfilled', value: 42 },
  9. // { status: 'rejected', reason: -1 }
  10. // ]

Promise.any()

只要参数实例有一个变成fulfilled状态,包装实例就会变成fulfilled状态;

如果所有参数实例都变成rejected状态,包装实例就会变成rejected状态。

  1. const promises = [
  2. fetch('/endpoint-a').then(() => 'a'),
  3. fetch('/endpoint-b').then(() => 'b'),
  4. fetch('/endpoint-c').then(() => 'c'),
  5. ];
  6. try {
  7. const first = await Promise.any(promises);
  8. console.log(first);
  9. } catch (error) {
  10. console.log(error);
  11. }

发表评论

表情:
评论列表 (有 0 条评论,316人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ES6--Promise对象

    Promise对象:代表了未来某个将要发生的操作,通常是异步操作 promise对象可以将异步操作以同步的流程表达出来,避免了层层嵌套的 回调函数(回调地狱),ES6的

    相关 ES6 -- Promise对象

    Promise是一种异步编程的解决方案,ES6提供原声的Promise,它比传统的解决方案,回调函数和事件,更加合理和强大。 Promise对象有以下两个特点: 1、对象的

    相关 ES6Promise

    ES6中为原生JS新增加了一个对象用来解决异步编程和问题,这个对象就是Promise。 那promise究竟是什么呢?这个真的是一件很难解释清楚的事情,他一共有三种状态,就像

    相关 es6Promise 对象

    Promise 是异步编程的一种解决方案,解决——回调函数和事件 ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。 下面代码创造了一个Prom

    相关 ES6--Promise对象

    概述 是异步编程的一种解决方案。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。 Promise 状态 状态的特点 Promise 异步操