我终于弄懂了Promise

作者: 源大侠 | 来源:发表于2021-02-22 09:06 被阅读0次

1.什么是Promise
a) ES6 异步编程的一种解决方案,比传统的方案(回调函数和事件)更加的合理和强大
b) 好处 异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数
c) promise可以解决异步的问题,本身不能说promise是异步的

2.Promise特点
a) 对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)、resolved(已成功)和rejected(已失败)
b) 一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为resolved和从pending变为rejected
c) promise内部发生错误,不会影响到外部程序的执行。
d) 无法取消Promise。一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。第三,当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)

3.基础用法
创造Promise实例时,必须传入一个函数作为参数

new Promise(() => {});
new Promise(); // 报错

该函数可以接收另外两个由JavaScript引擎提供的函数,resolve和reject。函数作用:
resolve——将Promise对象的状态从pending变为resolved,将异步操作的结果,作为参数传递出去
reject——将Promise对象的状态从pending变为rejected,将异步操作报出的错误,作为参数传递出去

let promise = new Promise((resolve, reject) => {
  // do something
  if (true) {
    // 将参数返回,供then方法使用
    resolve("value");
  } else {
    // 将参数返回,供then方法使用
    reject("error");
  }
});

Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。

promise.then(
  value => {
    // resolved时调用,value为resolve函数返回的参数
    console.log(value);
  },
  err => {
    // rejected时调用,err为reject函数返回的参数
    console.log(err);
  }
);

当then方法只有一个函数参数时,此时为resolved状态的回调方法

promise.then(value => {
    // 只有状态为resolved时才能调用,如果返回的是rejected状态,则报错 Uncaught (in promise) error
    console.log(value);
  });

只有当promise的状态变为resolved或者rejected时,then方法才会被调用
Promise 新建后就会立即执行,并且调用resolve或reject后不会终结 Promise的参数函数的执行。

let promise = new Promise(function(resolve) {
  console.log("Promise");
  resolve();
  console.log("!!!")
});

promise.then(function() {
  console.log("resolved.");
});
console.log("Hi!");

// Promise
// !!!
// Hi!
// resolved

resolve返回的是另外一个Promise实例

const p1 = new Promise((_, reject) => {
  setTimeout(() => reject('error'), 3000);
});

const p2 = new Promise(resolve => {
  setTimeout(() => resolve(p1), 1000);
});

p2.then(
  result => console.log(result),
  error => console.log(error) // error
);

上面代码中,p1是一个 Promise,3 秒之后变为rejected。p2的状态在 1 秒之后改变,resolve方法返回的是p1。由于p2返回的是另一个 Promise,导致p2自己的状态无效了,由p1的状态决定p2的状态。所以,后面的then语句都变成针对后者(p1)。又过了 2 秒,p1变为rejected,导致触发catch方法指定的回调函数。
以上是原文解释,我们可以理解成p2.then 实际上是p1.then

相关文章

  • 我终于弄懂了Promise

    1.什么是Promisea) ES6 异步编程的一种解决方案,比传统的方案(回调函数和事件)更加的合理和强大b)...

  • 我终于懂了

    原来,我在你的心中根本就没有那么重要,我还希望你给予什么安慰,好好经营自己的柴米油盐生活吧。 生活...

  • 我终于懂了

    今天,单位安排去植树! 虽然,腰伤没有完全好,但不想给别人留下议论的话题,也不想给领导说话,更...

  • 后来,我终于懂了

    分手前的某一天,你给我推了一首歌,王贰浪的<像鱼>。我以为,你是那条苦苦坚持的鱼,想要留住海洋。后来,我才知...

  • 我终于读懂了

    半个多月前在简书上写过一篇《我不是吃货,我只是饭桶》。写完就发给我爸妈了 ,后来他们一直没回复,吓得我也不敢问 ,...

  • 为了给新生留个好印象他可算是煞费苦心

    以前刚知道这位老师的时候听有的学生叫他“萌叔”,我不是很理解,后来,我终于懂了,终于懂了,懂了...... 听张老...

  • Promise 真的懂了吗?

    (1) var var在函数外定义,是全局变量,函数内可以使用 var在函数内定义,是局部变量,函数外不能使用 v...

  • 终于懂了

    小时候的梦想好多呀,科学家,海豚训练师,考个好大学,哈哈,直到去年,我才真正找到我一生都想做的事情——看遍世界美景...

  • 终于懂了

    这两天电视台在放《新白娘子传奇》,我打开的时候已经到后半部分许仕林与胡媚娘的爱恨纠结了。其实以前我一直不太喜欢媚娘...

  • 终于懂了

    以前我从不知道时事新闻的,但自从加入了简书,在看简书的同时,我了解了很多即时大新闻,这么多年,我一直深入简出,不谙...

网友评论

    本文标题:我终于弄懂了Promise

    本文链接:https://www.haomeiwen.com/subject/xokhfltx.html