当前位置:   article > 正文

简述promise原理_promise原理简单概括

promise原理简单概括

一、 promise应用场景

  • 1 解决回调地狱
    比如我们经常可能需要异步请求一个数据之后作为下一个异步操作的入参
  1. getData(function(a){
  2. getMoreData(a, function(b){
  3. getMoreData(b, function(c){
  4. getMoreData(c, function(d){
  5. getMoreData(d, function(e){
  6. ...
  7. });
  8. });
  9. });
  10. });
  11. });

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

但是你如果使用promise的话:

  1. function getData() {
  2. return new Promise(function (resolve, reject) {
  3. resolve(1);
  4. });
  5. }
  6. function getMoreData(arg) {
  7. return new Promise(function (resolve, reject) {
  8. resolve(arg + 10);
  9. });
  10. }
  11. getData().then(function (a) {
  12. console.log(a); // 1
  13. return getMoreData(a);
  14. }).then(function (b) {
  15. console.log(b); // 11
  16. })

把上面代码再简洁点儿

  1. getData()
  2. .then(a => getMoreData(a))
  3. .then(b => console.log(b));
  • 2 promise 可以实现在多个请求发送完成后 再得到或者处理某个结果
  1. // 两个数据都回来之后再进行操作
  2. let fs = require('fs');
  3. fs.readFile('./1.txt', 'utf8', function (err, data) {
  4. console.log(data);
  5. })
  6. fs.readFile('./2.txt', 'utf8', function (err, data) {
  7. console.log(data);
  8. })

使用promise的话就可以实现:

  1. let fs = require('fs');
  2. function read(url){
  3. return new Promise(function(resolve,reject){
  4. fs.readFile(url,'utf8',function(err,data){
  5. if(err)reject(err);
  6. resolve(data);
  7. })
  8. })
  9. }
  10. Promise.all([read('1.txt'),read('2.txt')]).then(data=>{
  11. console.log(data);
  12. },err=>{
  13. console.log(err);
  14. });

二、promise原理实现

1.最简单的实现
基于上面的应用场景发现promise可以有三种状态,分别是peddingFulfilledRejected

Pending Promise对象实例创建时候的初始状态
Fulfilled 可以理解为成功的状态
Rejected可以理解为失败的状态

  • 构造一个Promise实例需要给Promise构造函数传入一个函数。传入的函数需要有两个形参,两个形参都是function类型的参数。分别是resolvereject
  • Promise上还有then方法,then 方法就是用来指定Promise 对象的状态改变时确定执行的操作,resolve 时执行第一个函数(onFulfilled),reject时执行第二个函数(onRejected)
  • 当状态变为resolve时便不能再变为reject,反之同理。

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

  1. function Promise(executor){ //executor执行器
  2. let self = this;
  3. self.status = 'pending'; //等待态
  4. self.value = undefined; // 表示当前成功的值
  5. self.reason = undefined; // 表示是失败的值
  6. function resolve(value){ // 成功的方法
  7. if(self.status === 'pending'){
  8. self.status = 'resolved';
  9. self.value = value;
  10. }
  11. }
  12. function reject(reason){ //失败的方法
  13. if(self.status === 'pending'){
  14. self.status = 'rejected';
  15. self.reason = reason;
  16. }
  17. }
  18. executor(resolve,reject);
  19. }
  20. Promise.prototype.then = function(onFufiled,onRejected){
  21. let self = this;
  22. if(self.status === 'resolved'){
  23. onFufiled(self.value);
  24. }
  25. if(self.status === 'rejected'){
  26. onRejected(self.reason);
  27. }
  28. }
  29. module.exports = Promise;

参考文献:
https://www.cnblogs.com/greatluoluo/p/6288931.html

转自https://www.jianshu.com/p/fc5030e725ae

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/876470
推荐阅读
  

闽ICP备14008679号