一.背景
大家都知道nodejs快。为什么这么快?原因是节点使用异步回调来处理需要等待的事件,这样代码就可以继续执行,而无需在某个地方等待。不过,也有不好的地方。当我们有很多回调的时候,比如这个回调执行完之后,我们需要执行下一个回调,然后再执行下一个回调。这将导致逐层嵌套、代码不清晰以及容易访问“回调监狱”,这将很容易导致以下示例:
async(1,函数(值){ async(值,函数(值){ async(值,函数(值){ async(值,函数(值){ async(值,函数(值){ async(值,final)};});});});});});这种写法会让人崩溃,那么有没有办法解决这个问题,或者有没有其他写法?答案是肯定的,这个问题可以通过es6的新承诺对象和es7的asyncaware来解决。当然,这里首先介绍promise对象,es7的asyncaware将在后面的文章中分享。Promise对象将在未来推出。
二.介绍
Promise,一个对象,用来处理异步操作,可以让我们写异步调用更优雅,更美观,更易读。顾名思义就是promise的意思,就是用Promise之后他肯定会给我们一个答案,不管他成功还是失败,他都会给我们一个答案,所以我们不用担心他跑了。因此,Promise有三种状态:待定、已解决和已拒绝。只有异步返回的结构才能更改其状态。因此,承诺一般只有两个过程:待定-解决或待定-拒绝。
promise对象还有一个then方法,通常用于执行回调函数。然后方法接受两个参数,第一个是成功解析的回调,另一个是失败的被拒绝的回调,第二个失败的回调参数是可选的。然后方法还可以返回一个promise对象,这样就可以在链中调用它。那么代码:
Var Pro=function (time) {//返回一个Promise对象返回新的promise (function(解析,拒绝){ console . log(' 123 ');//模拟接口调用setTimeout(函数(){//这里告诉Promise它成功了,然后执行then方法的第一个函数,resolve('成功返回');},时间);}) };(function(){ console . log(' start ');Pro(3000)。然后(函数(数据){ console.log(数据);return Pro(5000);}) .然后(函数(数据){ console.log(数据);console . log(' end ');}) })();在上面的代码中,定义了一个Pro变量,然后给他分配了一个匿名函数,函数返回一个Promise对象,然后在对象中接收一个函数,解析和拒绝方法分别作为参数传入,异步请求由setTimeOut模拟。执行resolve方法时,将调用then方法的一个函数。结果如下:
第三,承诺的api
1.Promise.resolve()2、Promise.reject()3、Promise.prototype.then()4、Promise.prototype.catch()5、Promise.all() //全部完成,相当于和6。Promise.race() //。
1.Promise.resolve()函数将现有对象转换为Promise对象resolvedl承诺。解决('测试'==新承诺(解决=解决('测试')
2.Promise.reject()也返回一个被拒绝的Promise对象;状态。
3.那么方法上面已经介绍过了,这里就不介绍了。
4.catch():回调函数出错。
5.Promise.all()适合在所有结果完成后成功运行then()。例如:
let p1=new Promise(函数(解析,拒绝){ resolve(1);});让p2=新Promise(函数(解析,拒绝){ resolve(2);});让p3=新Promise(函数(解析,拒绝){ resolve(3);});Promise.all([p1,p2,p3])。然后(function(results){ console . log(' success : ' results);}).catch(function(r){ console . log(' error ');console . log(r);});最终输出:
6.Promise.race()的作用也是同时执行多个实例。只要一个实例更改状态,Promise就会被更改为该实例更改的状态;
四.例子
Var Pro=function () {//返回一个Promise对象返回新promise (function (resolve,reject)){//模拟调用settimeout(function(){ resolve(true)))的接口;}, 1000);}) };Var Pro2=function () {//返回一个Promise对象返回新promise (function (resolve,reject){//模拟接口调用settimeout(function(){ resolve(' Pro2成功执行'))));}, 1000);}) };Pro()。然后(函数(数据){ var val=dataconsole.log (val)的输出if (val) {console.log (1111)返回pro2 ()}})。然后(函数(data1) {console.log (data1)}):
这样就可以用then方法实现链式调用。
以上关于js promise的文章,足够阅读边肖与大家分享的全部内容,希望能给大家一个参考,多多支持我们。