promise-async-await详解
promise-async-await详解
auv!!!最近面试因为promise一知半解被gank惨了
就来把promise这个东西彻底搞透!!哼!!
1. 同步调用和异步调用
同步调用
func A() {
funcB() {
xxx}
//才能继续A的流程
}
funcA调用funcB,这种同步调用,在funcB执行完之前,后续的其他代码都不会执行
异步调用
read(file,buff); 即使文件还没读取完成read也可以立即返回。
在异步调用下,调用方不会被阻塞,可以立即执行下面的程序。
那么,调用方如何知道被调函数是否执行完成了呢??
ans:也许人家根本不想知道,嘻嘻
如果想知道的话,就需要回调函数
2. 同步调用和异步调用
1. 为什么要有promise的出现?
js在执行的时候一次只能执行一个任务,会阻塞其他的任务。
耗时同步函数的问题就是在运行时,程序没有反应,用户也不能进行任何的操作。(比如点击按钮生成100000个素数)
这时我们就需要调用一个函数来启动一个十分耗时的操作,让函数开始操作并立即返回,这样我们的程序就可以保持对其他事件做出反应的能力,继续向下执行。在耗时操作完成时,通知我们操作的结果。
异步操作:使得程序在执行一个可能长时间运行的任务的同时还能继续对其他事件做出反应而不必等待任务完成。
一些早期的异步API就是用这种方式设计的,如XMLHttpRequest API可以通过js向远程服务器发送HTTP请求,通过对XMLHttpRequest对象添加事件监听器来让程序完成时获得通知。
回调函数曾经是js中实现异步函数的主要方式
但是有些时候我们的回调都需要基于上一个回调,(比如第一个请求的返回结果需要作为第二个请求的参数。。。)多层回调函数的相互嵌套就是形成回调地狱,十分难以理解和维护。
此时,promise就出现啦!!!
2. promise是什么?能做什么?
通俗的讲,Promise就像一个容器,里面存放着未来结束返回结果的容器,返回的结果只需要在出口处接收就好了。在Promise返回给调用者的时候,操作往往还没完成,但Promise对象可以让我们操作最终完成时进行处理(成功或者失败都可以)。
官方上讲,Promise 对象代表了未来将要发生的事件,用来传递异步操作的消息
3. promise的用法
promise对象代表一个异步操作,有三种状态:pending,fulfilled,rejected, 且只有异步操作的结果可以决定当前是哪一种状态。