• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
可爱熊
熊爱可
博客园    首页    新随笔    联系   管理    订阅  订阅

Promise对象

1. 基本用法

  Promise对象是一个构造函数,用来生成Promise实例。

  Promise 新建后就会立即执行。

  let promise = new Promise(function(resolve, reject) {
    console.log('Promise');
    resolve();
  });

  promise.then(function() {
    console.log('resolved.');
  });

  首先输出的是Promise。然后,then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行,所以resolved最后输出。

  let promise = new Promise(function(resolve, reject) {
    console.log('Promise');
    resolve();
  });

  promise.then(function() {
    console.log('resolved.');
  });

  console.log('Hi!');
  console.log('xhk');

  //Promise
  //Hi!
  //xhk
  //resolved.

2. Promise.prototype.catch()

3. Promise.prototype.finally()

  finally方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。该方法是 ES2018 引入标准的。

4. Promise.all()

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

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

  Promise.all方法接受一个数组作为参数,p1、p2、p3都是 Promise 实例,如果不是,就会先调用下面讲到的Promise.resolve方法,将参数转为 Promise 实例,再进一步处理。(Promise.all方法的参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例。)

  p的状态由p1、p2、p3决定,分成两种情况。

  ①只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。

  ②只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。

  如果作为参数的 Promise 实例,自己定义了catch方法,那么它一旦被rejected,并不会触发Promise.all()的catch方法

5. Promise.race()

  romise.race方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。

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

  只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。

  Promise.race方法的参数与Promise.all方法一样,如果不是 Promise 实例,就会先调用下面讲到的Promise.resolve方法,将参数转为 Promise 实例,再进一步处理

6. Promise.resolve()

  将现有对象转为 Promise 对象

  Promise.resolve()的参数分为四种情况

  ①参数是一个promise实例

  如果参数是 Promise 实例,那么Promise.resolve将不做任何修改、原封不动地返回这个实例。

  ②参数是一个thenable对象

  thenable对象指的是具有then方法的对象

  let thenable = {
    then: function(resolve, reject) {
      resolve(42);
    }
  }

  Promise.resolve方法会将这个对象转为 Promise 对象,然后就立即执行thenable对象的then方法。

  ③参数是不具有then方法的对象,或者根本不是对象

  如果参数是一个原始值,或者是一个不具有then方法的对象,则Promise.resolve方法返回一个新的 Promise 对象,状态为resolved。

  const p = Promise.resolve('hello');

  p.then(s => console.log(s));  // hello

  ④不带有任何参数

  Promise.resolve方法允许调用时不带参数,直接返回一个resolved状态的 Promise 对象。

  立即resolve的 Promise 对象,是在本轮“事件循环”(event loop)的结束时,而不是在下一轮“事件循环”的开始时。

  setTimeout(function () {
    console.log('three');
  }, 0);

  Promise.resolve().then(function () {
    console.log('two');
  });

  console.log('one');  // one two three

  setTimeout(fn, 0)在下一轮“事件循环”开始时执行,Promise.resolve()在本轮“事件循环”结束时执行,console.log('one')则是立即执行,因此最先输出。

7. Promise.reject()

  Promise.reject(reason)方法也会返回一个新的 Promise 实例,该实例的状态为rejected。

  const p = Promise.reject('出错了');

  等同于

  const p2 = new Promise((resolve, reject) => reject('出错了'))

  p2.then(null, function (s) {
    console.log(s)
  });

  

  const thenable = {
    then(resolve, reject) {
      reject('出错了');
    }
  };

  Promise.reject(thenable)
    .catch(e => {
      console.log(e === thenable)
  })

  Promise.reject方法的参数是一个thenable对象,执行以后,后面catch方法的参数不是reject抛出的“出错了”这个字符串,而是thenable对象。

  const preloadImage = function(path) {
    return new Promise(function(resolve, reject) {
      const image = new Image();
      image.onload = resolve;
      image.onerror = reject;
      image.src = path;
    })
  }

8. Promise.try()

  让同步函数同步执行,异步函数异步执行,并且让它们具有统一的 API 呢?回答是可以的,并且还有两种写法。第一种写法是用async函数来写。

是不是你的耳朵是圆的,我的话是方的,所以你听不进去呀。
posted @ 2018-01-30 13:33  熊小可  阅读(118)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3