美文网首页
从几道题理解Promise作用和特征

从几道题理解Promise作用和特征

作者: agamgn | 来源:发表于2020-01-27 09:38 被阅读0次

前言

 Promise 想必大家都十分熟悉,想想就那么几个 api,可是你真的了解 Promise 吗?下面通过几道题理解Promise的作用。

一、Promise的立即执行性

let p=new Promise((resolve,reject)=>{
    console.log("1");
    resolve("2");
    console.log("3");
});
console.log("4");

p.then((value)=>{
    console.log(value);
})
console.log(5)
// 1
// 3
// 4
// 5
// 2

 Promise对象表示未来某个将要发生的事件,但在创建(new)Promise时,作为Promise参数传入的函数是会被立即执行的,只是其中作为参数中的两个函数执行的代码是异步代码。有些同学会认为,当Promise对象调用then方法时,Promise接收的函数才会执行,这是错误的,而是在then调用的时候,传入的函数中的参数函数才被执行,也就是resolve和reject才被执行。

二、Promise 三种状态

let p1=new Promise((resolve,reject)=>{
    resolve(1);
})
let p2=new Promise((resolve,reject)=>{
    setTimeout(()=>{
        resolve(2);
    },500);
})
let p3=new Promise((resolve,reject)=>{
    setTimeout(()=>{
        reject(3);
    },500);
})
console.log(p1);//Promise { 1 }
console.log(p2);//Promise { <pending> }
console.log(p3);//Promise { <pending> }

setTimeout(function(){
    console.log(p2);
  }, 1000);//Promise { <resolved> 2 }
  setTimeout(function(){
    console.log(p3);
  }, 1000);//Promise { <rejected> 3 }
  p1.then(function(value){
    console.log(value);
  });//1
  p2.then(function(value){
    console.log(value);
  });//2
  p3.catch(function(err){
    console.log(err);
  });//3

控制台分别输出:

Promise { 1 }
Promise { <pending> }
Promise { <pending> }
1
2
3
Promise { <resolved> 2 }
Promise { <rejected> 3 }

 Promise的内部实现是一个状态机。Promise有三种状态:pending,resolved,rejected。当Promise刚创建完成时,处于pending状态;当Promise中的函数参数执行了resolve后,Promise由pending状态变成resolved状态;如果在Promise的函数参数中执行的不是resolve方法,而是reject方法,那么Promise会由pending状态变成rejected状态。

三、Promise 状态的不可逆性

let p1=new Promise((resolve,reject)=>{
    resolve("p1成功");
    resolve("p1又成功");
});
let p2=new Promise((resolve,reject)=>{
    resolve("p2成功");
    reject("reject");
});
p1.then((value)=>{
    console.log(value);
})
p2.then((value)=>{
    console.log(value);
})

状态栏输出:

p1成功
p2成功

 Promise状态的一旦变成resolved或rejected时,Promise的状态和值就固定下来了,不论你后续再怎么调用resolve或reject方法,都不能改变它的状态和值。

四、链式调用

Promise.resolve(1)
.then((res)=>{
    console.log(res);
    return 2
})
.then((res)=>{
    console.log(res);
    return Promise.resolve(3)
})
.then((res)=>{
    console.log(res);
})
.catch((err)=>{
    console.log(err);
    return 4
})
//1
//2
//3

 promise 可以链式调用。promise 每次调用 .then 或者 .catch 都会返回一个新的 promise,从而实现了链式调用。其中return有以下三种情况:

  • return 一个同步的值 ,或者 undefined(当没有返回一个有效值时,默认返回undefined),then方法将返回一个resolved状态的Promise对象,Promise对象的值就是这个返回值。
  • return 另一个 Promise,then方法将根据这个Promise的状态和值创建一个新的Promise对象返回。
  • throw 一个同步异常,then方法将返回一个rejected状态的Promise, 值是该异常。

五、Promise then() 回调异步性

var p = new Promise((resolve, reject)=> {
    setTimeout(()=>{
        console.log("1");
        resolve("success");
    },1000)
});

p.then(function (value) {
    console.log(value);
});
p.then(function (value) {
    console.log(value);
});
//1
//success
//success

 Promise接收的函数参数是同步执行的,但then方法中的回调函数执行则是异步的,因此,"success"会在后面输出。

六、异常

Promise.resolve()
    .then(() => {
        return new Error('error!!!')
    })
    .then((res) => {
        console.log('then: ', res)
    })
    .catch((err) => {
        console.log('catch: ', err)
    })
//then:  Error: error!!!
// at Promise.resolve.then

 .then 或者 .catch 中 return 一个 error 对象并不会抛出错误,所以不会被后续的 .catch 捕获。

七、值穿透

Promise.resolve(1)
.then(2)
.then(Promise.resolve(3))
.then(console.log)
//1

 .then 或者 .catch 的参数期望是函数,传入非函数则会发生值穿透。

总结

本节代码

相关文章

  • 从几道题理解Promise作用和特征

    前言  Promise 想必大家都十分熟悉,想想就那么几个 api,可是你真的了解 Promise 吗?下面通过几...

  • 关于 ES6 中 Promise 的面试题

    说明 最近在复习 Promise 的知识,所以就做了一些题,这里挑出几道题,大家一起看看吧。 题目一 解析 首先 ...

  • Promise 题

    说明 最近在复习 Promise 的知识,所以就做了一些题,这里挑出几道题,大家一起看看吧(转载)。 题目一 解析...

  • Promise.any

    一 :本文从五个方面介绍 Promise.any : Promise.any 的作用 Promise.any 应用...

  • Promise.any 的作用,如何自己实现一个 Promise

    引言 本文从五个方面介绍 Promise.any : Promise.any 的作用 Promise.any 应用...

  • es6

    1、箭头函数的作用是什么 2、promise的作用和实现原理 3、async和promise的区别 4、let,c...

  • 【前端 JavaScript 高级】06 - Promise的入

    第 1 章 Promise的理解和使用 1.1 Promise 是什么? 1.1.1 理解 抽象表达 Promis...

  • promise经典面试题

    上期讲了promise基本概念和用法,今天结合上期的内容,讲解几道经典的相关面试题。 promise基本规则: 1...

  • Recommendation_System_news赛题理解+B

    赛题理解 赛题理解是切入一道赛题的基础,会影响后续特征工程和模型构建等各种工作,也影响着后续发展工作的方向,正确了...

  • 简单记录一下Promise的使用方法

    Promise 作用 Promise意在让异步代码变得干净和直观,让异步代码变得井然有序。 Promise在设计上...

网友评论

      本文标题:从几道题理解Promise作用和特征

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