异步回调函数带来的问题
1.回调地狱问题
前面我们也多次提过了,就是如果多个异步回调嵌套,就会有回调地狱的问题,不利于阅读和维护。
2.可靠性丢失问题
如果我们在开发中引入了第三方库,他是异步的,则在同步和异步执行,会导致控制权不完全由我们掌握,带来可靠性丢失。
解决方案:promise
通俗感性上解释promise
promise翻译过来是承诺。我们现实中对应吃饭的一个叫号机制。
当你去吃饭的时候,你报了你点的饭,不会马上给你,但是给你一个号码。等做好了就会叫号,你拿着号码去领。
这个号码其实就是一个promise,他会承诺你在未来某个时候做好了会通知你。
也就是说,我们通过promise,你异步有结果(不管成功还是失败),不要让我给你传递回调,你给我一个通知就好了。
promise的执行流程解析
异步函数写在promise的参数函数中
如果成功了,就调用resolve,如果失败了就调用reject。
它的返回值是一个primise对象p。
我们通过p上面的then方法,传递两个回调,如果成功就执行第一个回调,如果失败就执行第二个回调。
这样的好处就是我们可以拿到代码的控制权。
注意:
promise并没有移除回调,而是改变了回调传入的为止。但是因为有标准的promise机制去保证,我们的代码健壮性更强。
promise的保证机制
1.对象的状态不受外界影响
2.一旦状态改变就不会再变
3 如果promise返回了成功的信息,那么绑定在成功上面的回调就会得到这个消息
4 如果发生了错误,promise会收到一个错误通知。
promise的缺点
1.无法取消,一旦新建他就会立即执行,无法中途取消
2.如果不设置回调,promise内部如果抛出错误,外界是无法得知的
3当promise处于pending状态时,无法得知目前是刚刚开始还是即将完成。
总结:
promise解决了回调地狱难维护的问题,也解决了控制转移的问题。如果没有promise,我们就必须要很谨慎去使用涉及到异步的第三方库的代码,必须要想办法解决状态跟踪的问题。
有了promise之后,他能使得我们重新获取代码的控制权。我们在遵循promise机制的代码中不需要担心可靠性问题。