当前位置:   article > 正文

如何自定义Promise函数与详细讲解

如何自定义Promise函数与详细讲解

自定义Promise函数

  • 改变Promise的状态有 三种方式

    • resolve(),reject(),抛出异常
    • Promise的状态只能修改一次
    • Promise的then方法当中去执行回调
    • 异步任务 then 的 方法实现
    • 指定多个回调
    • 同步任务下then方法返回结果的实现
    • catch方法与异常穿透
    • Promise resolve方法封装
    • Promise reject方法封装
    • Promise all 方法封装
    • Promise race 方法封装
    • then指定的回调函数异步执行
      1. //声明构造函数
      2. function Promise(executor) {
      3. //给Promise对象添加属性
      4. this.PromiseState="pending";//默认值 pending
      5. this.PromiseResult=null;
      6. //声明属性来实现异步then的方法
      7. this.callbacks = [];
      8. //保存Promise实例对象 this 的值
      9. const self = this;

    // 声明成功时回调的resolve函数
    function resolve(data){
    //判断Promise的状态是否已经被修改 ,被修改就不能再次修改了 保证Promise的状态只能修改一次
    if(self.PromiseState !=='pending') return;
    //1.修改Promise对象的状态(promiseState)
    self.PromiseState = 'fulfilled';//成功:resolved、fulfilled
    //2.设置Promise对象结果值(promiseResult)
    self.PromiseState = data;

    1. //then指定的回调函数异步执行
    2. setTimeout(() => {
    3. // 调用成功的回调 来实现异步then的方法
    4. self.callbacks.forEach(item => {
    5. item.onResolved(data);
    6. });
    7. })

    }

    //声明失败时回调的reject函数
    function reject(data){
    //判断Promise的状态是否已经被修改 ,被修改就不能再次修改了 保证Promise的状态只能修改一次
    if(self.PromiseState !=='pending') return;
    //1.修改Promise对象的状态(promiseState)
    self.PromiseState = 'rejected';//失败:rejected
    //2.设置Promise对象结果值(promiseResult)
    self.PromiseState = data;
    //then指定的回调函数异步执行
    setTimeout(() => {
    // 调用失败的回调 来实现异步then的方法
    self.callbacks.forEach(item => {
    item.onRejected(data);
    });
    })

    }

    //抛出异常
    try {
    //同步调用【执行函数】
    executor(resolve,reject);
    } catch (error) {
    //修改Promise对象的状态为【失败】
    reject(error)
    }

}

//添加函数Promise的 then 方法
Promise.prototype.then =function(onResolved,onRejected){
const self = this;

  1. //判断回调函数参数
  2. if(typeof onRejected !== "function"){
  3. onRejected = reason=>{
  4. throw reason;
  5. }
  6. }
  7. if(typeof onResolved !== "function"){
  8. onResolved = value =>value;
  9. // onResolved = value=>{
  10. // return value;
  11. // }
  12. }
  13. return new Promise((resolve,reject)=>{
  14. //封装公用函数
  15. function callback(type){
  16. try {
  17. //获取回调函数的执行结果
  18. let result = type(self.PromiseResult);//传递结果值
  19. //判断 是否Promise 的对象
  20. if(result instanceof Promise){
  21. //如果是Promise类型的对象 可以调then 的方法
  22. result.then(v=>{
  23. resolve(v);
  24. },r=>{
  25. reject(r);
  26. })
  27. }else{
  28. //结果的对象状态为成功
  29. resolve(result);
  30. }
  31. } catch (error) {
  32. reject(error);
  33. }
  34. }
  35. //调用回调函数
  36. //1.判断成功调用onResolved
  37. if(this.PromiseState === "fulfilled"){
  38. //then指定的回调函数异步执行
  39. setTimeout(() => {
  40. callback(onResolved);
  41. });
  42. }
  43. //2.判断失败调用onRejected
  44. if(this.PromiseState === "rejected"){
  45. //then指定的回调函数异步执行
  46. setTimeout(()=>{
  47. callback(onRejected);
  48. })
  49. }
  50. //Promise异步任务 then 的 方法实现
  51. //1.判断 pengding的状态
  52. if(this.PromiseState === 'pending'){
  53. //状态不确定 保存回调函数
  54. this.callbacks.push({
  55. onResolved:function(){
  56. callback(onResolved);
  57. },
  58. onRejected:function(){
  59. callback(onRejected);
  60. }
  61. })
  62. }
  63. })

}

//添加catch 方法
Promise.prototype.catch = function(onRejected){
return this.then(undefined,onRejected);
}

//添加 resolve 方法 属于类 不是属于实例对象
Promise.resolve = function(value){
//返回Promise 对象
return new Promise((resolve,reject)=>{
if(value instanceof Promise){
value.then(v=>{
resolve(v);
},r=>{
reject(r);
})
}else{
//状态设置为成功
resolve(value);
}
})
}

//添加 Promise.reject 方法 属于类 不是属于实例对象
Promise.reject = function(reason){
//返回Promise 对象
return new Promise((resolve,reject)=>{
reject(reason);
})
}
//添加 Promise.all方法的封装 属于类 不是属于实例对象
Promise.all = function(promise){
//返回的结果是一个Promise对象
return new Promise((resolve,reject)=>{
//声明计数变量
let count = 0;
//声明成功存发的数据
let successResultArr = [];
for(let i=0;i<promise.length;i++){
promise[i].then(v={
//得知这个对象的状态时成功的
//每个promise对象成功才能调
count++;
//将当前成功的结果存入到数组中
successResultArr[i] = v;
if(count === promise.length){
resolve(successResultArr);
}
},r=>{
reject(r);
})
}
})
}

//添加 reject方法封装 属于类 不是属于实例对象
Promise.race = function(promise){
return new Promise((resolve,reject)=>{
for(let i=0;i<promise.length;i++){
promise[i].then(v={
//修改返回对象的状态为【成功】
resolve(v)
},r=>{
//修改返回对象的状态为【失败】
reject(r);
})
}
})
}

//给Promise 封装成一个类
class Promise{

  1. //构造方法
  2. constructor(executor){
  3. //给Promise对象添加属性
  4. this.PromiseState="pending";//默认值 pending
  5. this.PromiseResult=null;
  6. //声明属性来实现异步then的方法
  7. this.callbacks = [];
  8. //保存Promise实例对象 this 的值
  9. const self = this;
  10. // 声明成功时回调的resolve函数
  11. function resolve(data){
  12. //判断Promise的状态是否已经被修改 ,被修改就不能再次修改了 保证Promise的状态只能修改一次
  13. if(self.PromiseState !=='pending') return;
  14. //1.修改Promise对象的状态(promiseState)
  15. self.PromiseState = 'fulfilled';//成功:resolved、fulfilled
  16. //2.设置Promise对象结果值(promiseResult)
  17. self.PromiseState = data;
  18. //then指定的回调函数异步执行
  19. setTimeout(() => {
  20. // 调用成功的回调 来实现异步then的方法
  21. self.callbacks.forEach(item => {
  22. item.onResolved(data);
  23. });
  24. })
  25. }
  26. //声明失败时回调的reject函数
  27. function reject(data){
  28. //判断Promise的状态是否已经被修改 ,被修改就不能再次修改了 保证Promise的状态只能修改一次
  29. if(self.PromiseState !=='pending') return;
  30. //1.修改Promise对象的状态(promiseState)
  31. self.PromiseState = 'rejected';//失败:rejected
  32. //2.设置Promise对象结果值(promiseResult)
  33. self.PromiseState = data;
  34. //then指定的回调函数异步执行
  35. setTimeout(() => {
  36. // 调用失败的回调 来实现异步then的方法
  37. self.callbacks.forEach(item => {
  38. item.onRejected(data);
  39. });
  40. })
  41. }
  42. //抛出异常
  43. try {
  44. //同步调用【执行函数】
  45. executor(resolve,reject);
  46. } catch (error) {
  47. //修改Promise对象的状态为【失败】
  48. reject(error)
  49. }
  50. }
  51. //then 方法的封装
  52. then(onResolved,onRejected){
  53. const self = this;
  54. //判断回调函数参数
  55. if(typeof onRejected !== "function"){
  56. onRejected = reason=>{
  57. throw reason;
  58. }
  59. }
  60. if(typeof onResolved !== "function"){
  61. onResolved = value =>value;
  62. // onResolved = value=>{
  63. // return value;
  64. // }
  65. }
  66. return new Promise((resolve,reject)=>{
  67. //封装公用函数
  68. function callback(type){
  69. try {
  70. //获取回调函数的执行结果
  71. let result = type(self.PromiseResult);//传递结果值
  72. //判断 是否Promise 的对象
  73. if(result instanceof Promise){
  74. //如果是Promise类型的对象 可以调then 的方法
  75. result.then(v=>{
  76. resolve(v);
  77. },r=>{
  78. reject(r);
  79. })
  80. }else{
  81. //结果的对象状态为成功
  82. resolve(result);
  83. }
  84. } catch (error) {
  85. reject(error);
  86. }
  87. }
  88. //调用回调函数
  89. //1.判断成功调用onResolved
  90. if(this.PromiseState === "fulfilled"){
  91. //then指定的回调函数异步执行
  92. setTimeout(() => {
  93. callback(onResolved);
  94. });
  95. }
  96. //2.判断失败调用onRejected
  97. if(this.PromiseState === "rejected"){
  98. //then指定的回调函数异步执行
  99. setTimeout(()=>{
  100. callback(onRejected);
  101. })
  102. }
  103. //Promise异步任务 then 的 方法实现
  104. //1.判断 pengding的状态
  105. if(this.PromiseState === 'pending'){
  106. //状态不确定 保存回调函数
  107. this.callbacks.push({
  108. onResolved:function(){
  109. callback(onResolved);
  110. },
  111. onRejected:function(){
  112. callback(onRejected);
  113. }
  114. })
  115. }
  116. })
  117. }
  118. //catch 方法封装
  119. catch(onRejected){
  120. return this.then(undefined,onRejected);
  121. }
  122. //添加 resolve 方法 属于类 不是属于实例对象 所以用 static 来修饰 表示静态成员
  123. static resolve(value){
  124. //返回Promise 对象
  125. return new Promise((resolve,reject)=>{
  126. if(value instanceof Promise){
  127. value.then(v=>{
  128. resolve(v);
  129. },r=>{
  130. reject(r);
  131. })
  132. }else{
  133. //状态设置为成功
  134. resolve(value);
  135. }
  136. })
  137. }
  138. //添加 Promise.reject 方法 属于类 不是属于实例对象
  139. static reject(reason){
  140. //返回Promise 对象
  141. return new Promise((resolve,reject)=>{
  142. reject(reason);
  143. })
  144. }
  145. //添加 Promise.all方法的封装 属于类 不是属于实例对象
  146. static all(promise){
  147. //返回的结果是一个Promise对象
  148. return new Promise((resolve,reject)=>{
  149. //声明计数变量
  150. let count = 0;
  151. //声明成功存发的数据
  152. let successResultArr = [];
  153. for(let i=0;i<promise.length;i++){
  154. promise[i].then(v={
  155. //得知这个对象的状态时成功的
  156. //每个promise对象成功才能调
  157. count++;
  158. //将当前成功的结果存入到数组中
  159. successResultArr[i] = v;
  160. if(count === promise.length){
  161. resolve(successResultArr);
  162. }
  163. },r=>{
  164. reject(r);
  165. })
  166. }
  167. })
  168. }
  169. //添加 reject方法封装 属于类 不是属于实例对象
  170. static race(promise){
  171. return new Promise((resolve,reject)=>{
  172. for(let i=0;i<promise.length;i++){
  173. promise[i].then(v={
  174. //修改返回对象的状态为【成功】
  175. resolve(v)
  176. },r=>{
  177. //修改返回对象的状态为【失败】
  178. reject(r);
  179. })
  180. }
  181. })
  182. }

}

  1. ## async 函数
  2. - 函数的返回值 为 Promise 对象
  3. - promise 对象的结果有async 函数执行的返回决定
  4. ```javascript
  5. async function mian(){
  6. }

await 表达式

  • await 右侧的表达式一般为promise对象,但是也可以时其它的值
  • 如果表达式是promise对象,await 返回的是promise成功的值
  • 如果表达式时其他的值,直接将此值作为await的的返回值

    注意:await 必须写在async 函数中,但 async函数中可以没有await
    如果await 的promise 失败了,就会抛出异常,需要通过try...catch捕获处理

    1. async ffunction main(){
    2. let p = new Promise((resolve,reject)=>{
    3. //resolve('OK');
    4. reject('error');
    5. })
    6. //1.右侧为promise的情况
    7. // let p res = await p;// 返回结果为OK
    8. //2. 右侧为其他类型的数据
    9. // let res2 = await 20;//返回结果值为20
    10. // 3.如果promise 是失败的状态
    11. try {
    12. let res3 = await p;
    13. } catch (error) {
    14. console.log(error);
    15. }
    16. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/262688
推荐阅读
相关标签
  

闽ICP备14008679号