最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

promise原理

来源:动视网 责编:小采 时间:2020-11-27 15:02:35
文档

promise原理

promise原理:一、 promise应用场景1 解决回调地狱比如我们经常可能需要异步请求一个数据之后作为下一个异步操作的入参getData(function(a){ getMoreData(a, function(b){ getMoreData(b, function(c){ getMoreData(c, function(d){
推荐度:
导读promise原理:一、 promise应用场景1 解决回调地狱比如我们经常可能需要异步请求一个数据之后作为下一个异步操作的入参getData(function(a){ getMoreData(a, function(b){ getMoreData(b, function(c){ getMoreData(c, function(d){


一、 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;

文档

promise原理

promise原理:一、 promise应用场景1 解决回调地狱比如我们经常可能需要异步请求一个数据之后作为下一个异步操作的入参getData(function(a){ getMoreData(a, function(b){ getMoreData(b, function(c){ getMoreData(c, function(d){
推荐度:
标签: 原理 promise promises
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top