问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

promise原理是什么?

发布网友 发布时间:2022-04-24 07:10

我来回答

2个回答

懂视网 时间:2022-05-12 02:58

一、 promise应用场景

1 解决回调地狱

比如我们经常可能需要异步请求一个数据之后作为下一个异步操作的入参

getData(function(a){ 
 getMoreData(a, function(b){
 getMoreData(b, function(c){ 
  getMoreData(c, function(d){ 
  getMoreData(d, function(e){ 
   ...
  });
  });
 });
 });
});

可以发现上面的代码看起来是非常可怕的,层层嵌套,如果在加上复杂的逻辑判断,代码可读性会变得非常差。

但是你如果使用promise的话:

function getData() {
 return new Promise(function (resolve, reject) {
 resolve(1);
 });
}
function getMoreData(arg) {
 return new Promise(function (resolve, reject) {
 resolve(arg + 10);
 });
}
getData().then(function (a) {
 console.log(a); // 1
 return getMoreData(a);
}).then(function (b) {
 console.log(b); // 11
})

把上面代码再简洁点儿

getData()
.then(a => getMoreData(a))
.then(b => console.log(b));

2 promise 可以实现在多个请求发送完成后 再得到或者处理某个结果

// 两个数据都回来之后再进行操作
let fs = require('fs');
fs.readFile('./1.txt', 'utf8', function (err, data) {
 console.log(data);
})
fs.readFile('./2.txt', 'utf8', function (err, data) {
 console.log(data);
})
使用promise的话就可以实现:
let fs = require('fs');
function read(url){
 return new Promise(function(resolve,reject){
 fs.readFile(url,'utf8',function(err,data){
  if(err)reject(err);
  resolve(data);
 })
 })
}
Promise.all([read('1.txt'),read('2.txt')]).then(data=>{
 console.log(data);
},err=>{
 console.log(err);
});

二、promise原理实现

1.最简单的实现

基于上面的应用场景发现promise可以有三种状态,分别是pedding 、Fulfilled、 Rejected。

Pending Promise对象实例创建时候的初始状态

Fulfilled 可以理解为成功的状态

Rejected可以理解为失败的状态

构造一个Promise实例需要给Promise构造函数传入一个函数。传入的函数需要有两个形参,两个形参都是function类型的参数。分别是resolve和reject。

Promise上还有then方法,then 方法就是用来指定Promise 对象的状态改变时确定执行的操作,resolve 时执行第一个函数(onFulfilled),reject时执行第二个函数(onRejected)

当状态变为resolve时便不能再变为reject,反之同理。

基于上面描述我们可以实现一个这样的promise

function Promise(executor){ //executor执行器
 let self = this;
 self.status = 'pending'; //等待态
 self.value = undefined; // 表示当前成功的值
 self.reason = undefined; // 表示是失败的值
 function resolve(value){ // 成功的方法
 if(self.status === 'pending'){
  self.status = 'resolved';
  self.value = value;
 }
 }
 function reject(reason){ //失败的方法
 if(self.status === 'pending'){
  self.status = 'rejected';
  self.reason = reason;
 }
 }
 executor(resolve,reject);
}
Promise.prototype.then = function(onFufiled,onRejected){
 let self = this;
 if(self.status === 'resolved'){
 onFufiled(self.value);
 }
 if(self.status === 'rejected'){
 onRejected(self.reason);
 }
}
module.exports = Promise;

热心网友 时间:2022-05-12 00:06

Promise用法为:

const promise = new Promise((resolve, reject) => { setTimeout(() => { resolve('success') })}).then(value => { ... }, reason => { ... })

Promise的构造函数接收了一个回调,这个回调就是执行器,执行器的参数resolve, reject也是两个函数,前者将promise改变为fulfiled,后者将其改变为rejected。可以在执行器内根据实际业务来控制是resolve或reject。

当promise状态变为fulfilled,所有onFulfilled将会按照最开始在then方法中注册的顺序去调用,当promise状态变为rejected,所有onRejected将会按照最开始在then方法中注册的顺序去调用。

then所属的Promise在pending状态,将then的回调(onFulfilled, onRejected)分别放入执行队列等待执行,而这两个队列内的函数只有在then所属的promise状态被改变的时候执行。保证了规范中的onFulfilled, onRejected的执行时机。

扩展资料:

promise返回的结果取决于shouldBePromise,假设shouldBePromise为false,那么promise就返回了字符串ok,下边就不能调用then方法。这个时候可以用Promise().resolve包起来,这样promise返回的始终是一个promise实例,保证了then方法的顺利调用。

假设promise被resolve了,由于then中传入了代表onFulfilled的回调并且返回值为success,那么promise的reason值为success。假设promise2被reject了,由于then中传入了代表onRejected的回调并且返回值为failed,那么promise的reason值是failed。

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
没有收到高考短信是什么原因 高考报名审核没收到短信怎么回事 山东高考报名没给发短信是为什么 为什么高考报名没有短信通知 高考报名成功为什么没有收到短信 高考报名成功未收到短信该怎么办 高考报名后没有收到短信怎么办 注册滴滴显示车型不在城市车型库中怎么办 添加车辆一直说不在城市库里,能办不 票证时代:与人民币并行的硬通货 马思唯《promise》歌词内容是什么? promise的固定搭配是啥啊? win10时不时闪屏 “promise”怎么造句? win10更新后,会黑屏闪屏。怎么办怎么解决? 谁能发下魔兽世界美酒节成就的攻略? 我用的是WIN10,i5-6500加gtx750ti,有时闪一下就黑屏,过1秒后又好了,什么问题? promise英文怎么发音 美酒节的活动特色 promise是什么意思? 美酒节奖币怎么刷 promise什么意思? 笔记本电脑装上固态之后安装win10系统,为啥偶尔会闪屏和黑屏 求助,win10不停黑屏闪烁 魔兽世界美酒节是干什么的 win10 正版系统激活后 依然存在卡顿和闪黑屏! wow美酒节任务 promise的用法,详细的 美酒节一天可以赚到多少个美酒节金币啊? win10笔记本电脑屏幕突然变黑 promise的三种状态 【英语】promise的词性、用法、其他形式、其他形式的用法、词组_百度知 ... 臭鳜鱼怎么做? 臭桂鱼是怎么做的? 臭桂鱼怎么烧好吃 臭鲑鱼怎样做好吃 臭鳜鱼怎么做,口感更佳,非常的美味可口? 安徽臭桂鱼的由来是什么? 臭桂鱼怎么做好吃 臭桂鱼的做法大全有哪些 安徽有什么特色菜,吃遍徽州特色菜 《我是夜色中的玫瑰》是哪首歌里词。 短文《夜色下的玫瑰》的答案 冰丝带有钢铁为材料的优点 我是夜色中的玫瑰这个歌词,是什么哥里面似的,谁唱的。 北京冬奥会国家速滑馆“冰丝带”,为何能频频诞生世界纪录? 关于冰丝带的作文? 冬奥会中“雪游龙”“雪飞燕”“冰丝带”这些昵称指的是什么? 红色玫瑰花的比喻句 “冰丝带”首个世界纪录诞生,这名选手究竟是谁?来自哪个国家?
  • 焦点

最新推荐

猜你喜欢

热门推荐