怎么在ES6中使用的承诺

  介绍

怎么在ES6中使用承诺?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

在javascript中,代码是单线程执行的,对于一些比较耗时的IO操作,都是通过异步回调函数来实现的。

但是这样会存在一个问题,当下一个的操作需要上一个操作的结果时,我们只能把代码嵌到上一个操作的回调函数里,这样一层嵌一层,最终形成回调地狱。

$ . get (& # 39;/login # 39;,, function (登录),{   $ . get(才能& # 39;/user.php& # 39;,, function (用户),{   ,,,$ . get (& # 39;/info.php& # 39;,, function (信息),{   ,,,,,//代码就这样一层嵌一层,不够直观,维护也麻烦   ,,,});   ,,});   });

为了解决这种问题,ES6中就提供了承诺方法来解决这种问题。

承诺是一个构造函数,通过它,我们可以创建一个承诺实例对象。

let  p =, new 承诺(function (解决,,拒绝),{   setTimeout(才能(),=祝辞,{   ,,,console.log(& # 39;好# 39;);   ,,,解决(& # 39;好# 39;);   ,,},1000);   });

承诺构造函数接受一个函数作为参数,这个函数有两个参数,解决和拒绝。

解决函数是将承诺的状态设置为满足(完成),拒绝函数是将承诺的状态设置为拒绝(失败)。

上述代码,我们并没有进行任何调用,当运行时,间隔1秒后输出了& # 39;好# 39;,所以这里需要注意,我们通常使用承诺时,需要在外层再包裹一层函数。

let  p =, function  (), {   return 才能;new 承诺(function (解决,,拒绝),{   ,,,setTimeout((),=祝辞,{   ,,,,,console.log(& # 39;好# 39;);   ,,,,,解决(& # 39;好# 39;);   ,,,},,1000);   ,,});   };   p ();

上面的代码p();返回的是一个承诺实例对象,承诺对象上有(),(),最后()方法。

然后方法有两个参数,onFulfilled和onRejected,都是函数。

onFulfilled用于接收解决方法传递过来的数据,onRejected用于接收拒绝方法传递过来的数据。

let  p =, function  (), {   return 才能;new 承诺(function (解决,,拒绝),{   ,,,setTimeout((),=祝辞,{   ,,,,,if  (math . random(),祝辞,0.5),{   ,,,,,,,解决(& # 39;好# 39;);   ,,,,,},{else    ,,,,,,,拒绝(& # 39;错# 39;);   ,,,,,}   ,,,},,1000);   ,,});   };   p () (function (数据),{   console.log才能(& # 39;实现# 39;,,数据);   },,function (错),{   console.log才能(& # 39;拒绝# 39;,,呃);   });

然后()方法总是会返回一个承诺实例,这样我们就可以一直调用()。

在那方法中,你既可以返回一个具体的值,还可以返回一个承诺对象。

如果直接返回的是一个数据,然后那方法会返回一个新承诺对象,并以该数据进行解决。

let  p =, function  (), {   return 才能;new 承诺(function (解决,,拒绝),{   ,,,解决(1);   ,,});   };   p () (function (数据),{   console.log才能(“第,${数据},次调用的);//才能注意这里直接返回的值//然后才能会创建一个新的承诺对象,并且以返回的值进行解决//那才能么该值会被下面之后的方法的onFulfilled回调拿的到   return 才能;+ +数据;   })(function (数据),{   console.log才能(“第,${数据},次调用的);   return 才能;+ +数据;   })(function (数据),{   console.log才能(“第,${数据},次调用的);   return 才能;+ +数据;   });

如果返回的是一个承诺对象,请看下面代码。

let  p =, function  (), {   return 才能;new 承诺(function (解决,,拒绝),{   ,,,解决(1);   ,,});   };   p () (function (数据),{   console.log才能(“第,${数据},次调用的);   return 才能;new 承诺(function (解决,,拒绝),{   ,,,解决(+ +数据);   ,,});   })(function (数据),{   console.log才能(“第,${数据},次调用的);   return 才能;new 承诺(function (解决,,拒绝),{   ,,,解决(+ +数据);   ,,});   })(function (数据),{   console.log才能(“第,${数据},次调用的);   return 才能;new 承诺(function (解决,,拒绝),{   ,,,解决(+ +数据);   ,,});   });

其实效果与直接返回值的是一样的。

即然然后()可以进行链式操作,那我们最早之前的回调地狱写法,就可以通过它进行改进了。

怎么在ES6中使用的承诺