理解JS中的Promise_今日关注

来源:博客园

2023-05-24 18:50:34

通常JS代码是单线程的、按顺序执行的。当遇到网络数据传递、文件读写等耗时操作时,JS可以不必要等待生成结果,而是启用一个异步操作,继续执行后续的代码。 当耗时操作结束后,再回调其结果。例如:

console.log("coding beginning !!")  setTimeout(() => {      console.log(" a delay operation");  }, 1000);  console.log("coding ending")

代码的执行结果

coding beginning !!  coding ending  a delay operation                

上述运行结果,首先执行第一条语句,第条语句是一个异步操作,耗时1秒钟。JS解释器执行到这儿时不会等到这条语句执行完后再执行第三条 语句,而是并行的执行第三条语句。等到第二条耗时操作结束后,再回调结果,在本例中就是执行箭头函数()=>console.log(" a delay operation")。


(资料图片)

Promise

实际上Promse的规范是异步执行的,Promise是一个异步操作。Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve 和 reject。

// 创建未完成的Promise对象  const promise = new Promise(function(resolve,reject){      // ...耗时的操作      if (/*成功条件*/){          resolve( "200 OK")      }else{          reject("fail");      }  }).then(function resolve(sucess){          }).catch(function reject(fail){          });  // ... 接下来的操作

Promise执行一个耗时操作,这个操作有两个函数分别是resolve和reject。因为这个操作耗时比较长,JS解释器不会阻塞在此处,而是执行接下来的 操作,异步地执行。当解释器等到Promise操作完成时,根据结果判断,成功就调用then的resolve函数,失败就调用catch的reject函数。

下面对Promse操作举例:

function test(resolve, reject) {      var timeOut = Math.random() * 2;      console.log("set timeout to: " + timeOut + " seconds.");      setTimeout(function () {          if (timeOut < 1) {              console.log("call resolve()...");              resolve("200 OK");  //成功时的回调函数          }else {              console.log("call reject()...");              reject("timeout in " + timeOut + " seconds."); //失败时的回调函数          }      }, timeOut * 1000);  }  var promise = new Promise(test).then(function resolve(success){      //成功时的回调函数体      console.log(success);  }).catch(function reject(fail){      //失败时的回调函数体      console.log(fail);  })

上述代码利用Promise模拟一个异步操作,如果延迟时间在1秒内回调then里的resolve函数,如果延迟时间大于1秒,回调catch里的reject函数。上述 的test、resolve、reject函数都可以用匿名函数或箭头函数取代。

var promise = new Promise((resovle,reject)=>{      console.log("set timeout to: " + timeOut + " seconds.");      setTimeout(function () {          if (timeOut < 1) {              console.log("call resolve()...");              resolve("200 OK");  //成功时的回调函数          }else {              console.log("call reject()...");              reject("timeout in " + timeOut + " seconds."); //失败时的回调函数          }      }, timeOut * 1000);  }).then((success)=>{      //成功时的回调函数体      console.log(success);  }).catch((fail)=>{      //失败时的回调函数体      console.log(fail);  })

Promise的几种状态

一个promise有三种状态,未开始执行前它的promise状态是pending状态,在异步执行过程中,如果结果是调用了函数参数中的第一个函数,那么它 的promise状态就是fulfilled状态,如果处理结果是调用了函数参数中的第二个函数,那么它的promise状态就是rejected状态。

var p = new Promise((resolve,reject)=>{      if (...){          resolve("success")  //假如最终结果如果调用了resolve函数,p的promise状态是fulfilled,而promise的结果是"success"      }else{          reject("fail") //假如最终结果如果调用了resolve函数,p的promise状态是rejected,而promise的结果是"fail"      }  })  p.then(rs=>console.log(rs));  //success  p的promise状体是fulfilled的,就执行本句。rs就是promise的结果  .catch(err=>console.log(err)); //fail p的promise状体是rejected的,就执行本句。rs就是promise的结果

Promise的静态方法all

多个promise如果其结果状态同为fulfilled,由其组成的promise的状体就是fulfilled,否则是rejected

var p1 = new Promise((resolve,reject)=>{      resolve("ok");  })  var p2 = new Promise((resolve,reject)=>{      reject("fail");  })  var p = Promise.all([p1,p2]).then(rs=>console.log(rs)).catch(rs=>console.log(rs));   //fail

Promise的静态方法any

多个promise如果其中一个最先结果状态为fulfilled,则返回fulfilled状态,否则返回rejected状态

const pErr = new Promise((resolve, reject) => {      reject("总是失败");    });        const pSlow = new Promise((resolve, reject) => {      setTimeout(resolve, 500, "最终完成");    });        const pFast = new Promise((resolve, reject) => {      setTimeout(resolve, 100, "很快完成");    });        Promise.any([pErr, pSlow, pFast]).then((value) => {      console.log(value);    })    //"很快完成"

Promise的静态方法race

多个promise最先生成的结果状态就是返回的状态。

const pSlow = new Promise((resolve, reject) => {      setTimeout(resolve, 500, "最终完成");  });    const pFastError = new Promise((resolve, reject) => {      setTimeout(reject, 100, "很快玩完");  });  Promise.race([pSlow, pFastError]).then((value) => {      console.log(value);  })  //"很快玩完"

文章同时发表在:码农编程网欢迎访问

本节重点

  • 理解JS中的异步操作;
  • Promise是一个异步操作,Promise对象在成功时回调then中的函数,而失败时调用catch中的函数。
  • 了解Promise的all方法,any方法和race方法

关键词:

理解JS中的Promise_今日关注

通常JS代码是单线程的、按顺序执行的。当遇到网络数据传递、文件读写等耗时操作时,JS可以不必要等待生成结[详细]
2023-05-24

“荔枝上市,百果让路”,这5种荔枝吃法,让舌尖尽享清甜美味

过了小满,正是荔枝开始大量上市的时候了,“荔枝上市,百果让路”,“妃子笑”是早熟的品种之一,绿色的表[详细]
2023-05-24

安谧读音_安谧

1、安谧是指安定平静安静有两种意思,一是安定,平静。2、二是没有声音,没有吵闹和喧哗。3、安谧的程度比[详细]
2023-05-24

【环球速看料】鲈鱼清蒸怎么蒸好吃?这样做,鱼肉鲜嫩,好吃无腥味

蒸鲈鱼时,牢记“2不放,加4样”的诀窍,鱼肉鲜嫩,好吃无腥味我们家人非常喜欢吃鱼,首先就是鱼肉真的非常[详细]
2023-05-24

世界观天下!国际mba和国内mba哪个好?需比较这些

选择国际MBA还是国内MBA应该根据自己的个人情况和发展需求来决定。如果你想要拓展国际视野和提高跨文化交流[详细]
2023-05-24

每日时讯!房产继承

房产继承[详细]
2023-05-24

做生意财神爷摆放位置示意图

在商业世界中,追求财富和成功是每个人的共同愿望。为了招财进宝、取得商业上的好运,很多人会选择供奉财神[详细]
2023-05-24

焦点热文:都柏林是哪个国家的首都啊_都柏林是哪个国家的

1、爱尔兰,1949年4月,爱尔兰完全独立后。2、都柏林被正式定为首都,成为政府机构、议会、最高法院所在地[详细]
2023-05-24

厦门国际银行连续四年荣膺“铁马”十佳中小银行奖|资讯

近日,“2023(第十一届)中小银行发展高峰论坛暨第五届‘铁马’中小银行评选颁奖典礼”在武汉召开。会上,[详细]
2023-05-24

环球观焦点:三七互娱(002555):2022年度股东大会决议

证券代码:002555证券简称:三七互娱公告编号:2023-032三七互娱网络科技集团股份有限公司2022[详细]
2023-05-24
版权所有: 北冰洋制冷网 All Rights Reserved
沪ICP备2020036824号-3
联系邮箱:562 66 29@qq.com