怎么在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 (解决,,拒绝),{ ,,,解决(+ +数据); ,,}); });
其实效果与直接返回值的是一样的。
即然然后()可以进行链式操作,那我们最早之前的回调地狱写法,就可以通过它进行改进了。