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

558 阅读3分钟

*前言:

过去初学JavaScript的时候,令人难以琢磨的就是函数了,在某些方面对函数对象的应用,确实给code 编写中带来了很多方便之处。

JavaScript语言的执行环境是“单线程”的,试想,如果在JavaScript中没有异步操作,我们根本就不能使用它了。而这其中 回调函数 ,就是早期用它来解决异步操作问题的最初方法。

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

将多层回调函数的嵌套,我们称之为:回调地狱。

当回调函数层层嵌套过多时,将不再使用回调函数解决异步操作问题,将使用Promise。

在ES6语言标准规定中,Promise是一个对象,代表着一个异步操作,它可以获取异步操作的消息,进而改变Promise自身的状态。Promise这个对象有三种状态:

1.等待pending  2.已失败reject  3.已成功fulfill。

有了Promise对象,我们就可以将异步操作以同步的方式表达出来。*

##基本用法:

```//ES6中规定,Promise对象是一个构造函数,用来生成Promise实例。

let promise = new Promise(function(resolve,reject) {
    创建Promise对象时,promise是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对象的缺点。
1:
    我们一旦创建了Promise对象,它是无法取消的,并且它会立即执行(箭在弦上)
2:
    我们必须要将Promise与回调函数结合使用,意思是说,如果我们不通过then方法设置回调函数,
    Promise对象的结果将不会反应到外部。
    
    
【以上,就是我向大家介绍的有关Promise的初级概念,我将在下一篇文章中,
向大家介绍Promise对象的其他方法比如race,all等方法】