promise知识点小结

断断续续学习es6也有一段时间了,趁着开学空闲对知识点做一些小结。

为什么使用promise

谈到Promise,我们知道,这是社区较理想的异步编程解决方案。想要掌握promise,我们首先要知道其提出原因。promise的提出很好的解决了多个相互依赖的代码之间的嵌套问题,比如说C代码需要B代码的结果,B代码需要A代码的结果,用传统的方案,会出现层层嵌套的情况,不易维护。

promise对象是什么

promise对象一共有三种状态

  • pending(进行中)
  • fulfilled(已成功)
  • rejected

promise对象有几种相关方法

let promise = new Promise((resolve,reject) => {
    //....
    resolve('2');
    

    //....
    //reject('4');
})

最简单创建对象的方法,就是为resolve和reject的状态分别传递参数,也就是成功后的信息或是失败时的提示,当然,不一定要两种状态同时都有。

then方法,接受两个参数,第一个为fulfilled状态下要进行的步骤,第二个参数可选,指的是rejected状态下执行的方法
当然,更推荐使用catch方法来定义错误状态下的方法,也和try...catch结构类似

promise
  .then((data) => { //cb
    // success
  })
  .catch((err) => {
    // error
  });

这个对象有几个特点,

1.比如状态一旦更改,就不会再发生变化,也就是说pending状态一旦转换成fulfuilled或rejected就不再变化了。

let promise = new Promise((resolve,reject) => {

    resolve('2');
    reject('4');
})

比如上面的代码,promise在进入fulfulled状态后就不再发生变化了,因此reject的操作是无效的。

2.比如promise对象创建中的代码是同步的,而then方法是异步的。

let promise = new Promise((resolve, reject) => {
    console.log('1');
    resolve('2');
  });
promise.then((resolve,reject) => {
    console.log(resolve);

})
console.log(3);

// 1 3 2

promise对象创建以后立即执行,故输出1,then方法为异步执行,被放入等待的实践队列,在本次事件循环结束时执行,故先打印3,最后打印2。
3.不会主动抛出错误
这一点比较特别,意味着我们必须定义catch方法或then的第二个参数来获取错误,不然,错误无法被发现
4.chain 链式结构
then函数的可以接另一个then函数,而then函数返回一个promise对象,因此,这一个promise对象就决定了执行后面的哪些方法

与promise相关的问题

then方法与settimeout
这一个问题非常典型,其实只要明白一点:settimeout在下一轮“事件循环”的时候开始执行,Promise.then()在本轮“事件循环”结束时执行。

setTimeout(function () {
    console.log('1');
}, 0);
  
Promise.resolve().then(function () {
    console.log('2');
});
console.log('3');

输出3 2 1

其实,这些方法,还是要多使用,多练习,才能得心应手

原文地址:https://www.cnblogs.com/yuyuan-bb/p/10472966.html