promise解决回调地狱;啥?前端还有“地狱?”

前言:编程

当我过去初学JavaScript的时候,以为使人最让人难以琢磨的就是函数,在某些方面函数对象的应用,确实给我带了不少方便。 JavaScript语言的执行环境是“单线程”的,因此试想一下,若是在JavaScript中没有异步操做,咱们根本就不能使用它了。其中回调函数,就是早期用它来解决异步操做问题的。promise

【有关异步操做,我将会在以后的文章中,与你们共谈,关于Generator】异步

回调函数的用法之广,好比在某段代码中插入回调函数,意味着将以前的打包好的“代码块”在某处再执行一次,上文中,也阐述了回调函数能解决异步编程的问题。 可是你们有没有想过,当回调函数嵌套过多致使回调函数累积,咱们的代码维护起来是否是就是极其的复杂,多层回调函数的嵌套使咱们的代码就偏离了“高内聚,低耦合”的设计理念,牵一发而动全身。异步编程

因此咱们将多层回调函数的嵌套,咱们称之为:回调地狱。(跟地狱这个词扯上关系,都不是啥好事)。函数

当回调函数层层嵌套过多时,咱们将再也不运用回调函数解决异步操做问题,咱们使用Promise。spa

在ES6语言标准规定中,Promise是一个对象,表明着一个异步操做,它能够获取异步操做的消息,进而改变Promise自身的状态。Promise这个对象有三种状态:1.等待pending2.已失败reject3.已成功fulfill。线程

有了Promise对象,咱们就能够将异步操做以同步的方式表达出来。(这给Promise对象厉害的,可是它也有弊端,我将在文末与你们说明。)设计

##基本用法: ```//ES6中规定,promise对象是一个构造函数,用来生成Promise实例。code

var promise = new Promise(function(resolve,reject) {
    //咱们刚建立Promise对象时,P是pending状态。Promise对象用一个函数做为参数,而且这个
    函数有两个参数resolve与reject,值得注意的是这两个参数也是两个函数。(“敲黑板了,别被我绕
    晕了铁子们”),咱们调用这两个函数,就会将Promise的状态切换到相对应的状态,调用resolve,
    会切换到成功状态(并将异步操做的结果做为参数传递给外面);调用reject是失败的状态。
    
})

Promise实例生成以后,咱们能够经过then方法分别指定Resolved状态和Rejected状态的回调函数。
【Promise只是给了回调函数一个平台,咱们将异步操做以同步方式表达出来】
promise.then(function(data) {
    //当promise切换到fulfill状态时,会调用该函数
    console.log('当状态为fulfill我才会被调用',data)
},function(error) {
//【在此咱们要注意:第二个回调函数是可选的】
    //当promise切换到reject状态时,会调用该函数
    console.log('当状态为reject我才会被调用',error)
})
//【then方法能够接受两个回调函数做为参数,这两个回调函数的参数都是都是promise对象传出的值】。

//promise对象新建以后就会当即执行,then方法指定的回调函数将在当前脚本全部的同步任务执行完成以后才
会执行。

最后咱们来谈一谈Promise对象的缺点。
first:
    咱们一旦建立了Promise对象,它是没法取消的,而且它会当即执行(箭在弦上)
second:
    咱们必需要将Promise与回调函数结合使用,意思是说,若是咱们不经过then方法设置回调函数,
    Promise对象的结果将不会反应到外部。
    
    
【以上,就是我向你们介绍的有关Promise的初级概念,我将在下一篇文章中,
向你们介绍Promise对象的其余方法好比catch,all等方法】
复制代码

总结:我在这里向你们打个比方,在没有Promise对象以前,咱们层层嵌套的回调函数就像是手动扔手榴弹 ,咱们一通猛扔,可是并不知道各个手榴弹的爆以后炸信息;当咱们引用Promise对象以后, 对咱们来讲不是扔手榴弹了,而是像发射导弹同样,精准定位,精确打击,而且咱们通 导弹发射装置的雷达系统(Promise),能获得每次发射的结果,来决定咱们下次是否还 要继续发射。对象

相关文章
相关标签/搜索