Promise 与 回调 与 异步
Promise 与 回调 与 异步
异步与回调
关联
异步任务需要在得到结果时通知 JS 来拿结果
可以让 JS 留一个函数地址(电话号码)给浏览器,异步任务完成时浏览器调用该函数地址即可(拨打电话),同时把结果作为参数传给该函数(电话里说可以来吃了),这个函数是我写给浏览器调用的,所以是回调函数
总结:异步任务不能拿到结果,于是我们传一个回调给异步任务,异步任务完成时调用回调,调用的时候把结果作为参数
区别
异步任务需要用到回调函数来通知结果,但回调函数不一定只用在异步任务里,回调可以用到同步任务里
array.forEach( n => console.log(n) )
就是同步回调
异步
区别同步:同步指JS一直等待某个函数的结果,拿到结果之后JS才会继续向下执行代码
-
如果 JS 不能直接拿到一个函数的结果,可以先去执行别的代码,等结果到了再取结果,这就是异步
-
异步的结果可以通过轮询获取,轮询就是定时去询问结果拿到了没有
-
异步的结果可以通过回调获取,一般来说结果会被作为回调的第一个参数
-
异步的好处是可以把用来等待的时间拿去做别的事情
如果一个函数的返回值处于
-
setTimeout
-
AJAX(即 XMLHttpRequest)
-
AddEventListener
这三个东西内部,那么这个函数就是异步函数
回调
-
满足某些条件的函数才被称为回调,比如我写一个函数 A,传给另一个函数 B 调用,那么函数 A 就是回调
-
回调可以用于同步任务,不一定非要用于异步任务
-
有的时候回调还可以传给一个对象,如 request.onreadystatechange,等待浏览器来调用
Promise
优点:
-
规范回调的名字或顺序
-
拒绝回调地狱,让代码可读性更强
-
很方便地捕获错误
使用 return new Promise((resolve, reject)=> {})
就可以构造一个 Promise 对象,构造出来的 Promise 对象含有一个 .then()
函数属性,resolve 和 reject 可以改成任何其他名字,不影响使用,但一般就叫这两个名字,任务成功的时候调用 resolve,失败的时候调用 reject,resolve 和 reject 都只接受一个参数,resolve 和 reject 并不是 .then(success, fail) 里面的 success 和 fail,resolve 会去调用 success,reject 会去调用 fail