Promise 与 回调 与 异步

Promise 与 回调 与 异步

异步与回调

关联

异步任务需要在得到结果时通知 JS 来拿结果

可以让 JS 留一个函数地址(电话号码)给浏览器,异步任务完成时浏览器调用该函数地址即可(拨打电话),同时把结果作为参数传给该函数(电话里说可以来吃了),这个函数是我写给浏览器调用的,所以是回调函数

总结:异步任务不能拿到结果,于是我们传一个回调给异步任务,异步任务完成时调用回调,调用的时候把结果作为参数

区别

异步任务需要用到回调函数来通知结果,但回调函数不一定只用在异步任务里,回调可以用到同步任务里

array.forEach( n => console.log(n) ) 就是同步回调

异步

区别同步:同步指JS一直等待某个函数的结果,拿到结果之后JS才会继续向下执行代码

  • 如果 JS 不能直接拿到一个函数的结果,可以先去执行别的代码,等结果到了再取结果,这就是异步

  • 异步的结果可以通过轮询获取,轮询就是定时去询问结果拿到了没有

  • 异步的结果可以通过回调获取,一般来说结果会被作为回调的第一个参数

  • 异步的好处是可以把用来等待的时间拿去做别的事情

如果一个函数的返回值处于

  • setTimeout

  • AJAX(即 XMLHttpRequest)

  • AddEventListener

这三个东西内部,那么这个函数就是异步函数

回调

  • 满足某些条件的函数才被称为回调,比如我写一个函数 A,传给另一个函数 B 调用,那么函数 A 就是回调

  • 回调可以用于同步任务,不一定非要用于异步任务

  • 有的时候回调还可以传给一个对象,如 request.onreadystatechange,等待浏览器来调用

Promise

优点:

  1. 规范回调的名字或顺序

  2. 拒绝回调地狱,让代码可读性更强

  3. 很方便地捕获错误

使用 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


Promise 与 回调 与 异步
https://bald3r.wang/2022/06/24/16-Promise与异步与回调/
作者
Allen
发布于
2022年6月24日
许可协议