背景
JavaScript 是单线程。。。
https://mp.weixin.qq.com/s/WIVYOtuiXQvg-IsY6cHb5w
回调函数
Web 页面的单线程架构决定了异步回调,而异步回调影响到了我们的编码方式
封装异步代码,让处理流程变得线性
封装请求过程
//[in] request,请求信息,请求头,延时值,返回类型等
//[out] resolve, 执行成功,回调该函数
//[out] reject 执行失败,回调该函数
function XFetch(request, resolve, reject) {
let xhr = new XMLHttpRequest()
xhr.ontimeout = function (e) { reject(e) }
xhr.onerror = function (e) { reject(e) }
xhr.onreadystatechange = function () {
if (xhr.status = 200)
resolve(xhr.response)
}
xhr.open(request.method, URL, request.sync);
xhr.timeout = request.timeout;
xhr.responseType = request.responseType;
//补充其他请求信息
//...
xhr.send();
}
XFetch(makeRequest('https://time.geekbang.org'),
function resolve(data) {
console.log(data)
}, function reject(e) {
console.log(e)
})
Promise
Promise 解决的是异步编码风格的问题
- 消灭嵌套调用
- 回调函数的延时绑定
- 将回调函数 onResolve 的返回值穿透到最外层
- 合并多个任务的错误处理
Web 页面的单线程架构决定了异步回调,而异步回调影响到了我们的编码方式
封装异步代码,让处理流程变得线性
封装请求过程
//[in] request,请求信息,请求头,延时值,返回类型等
//[out] resolve, 执行成功,回调该函数
//[out] reject 执行失败,回调该函数
function XFetch(request, resolve, reject) {
let xhr = new XMLHttpRequest()
xhr.ontimeout = function (e) { reject(e) }
xhr.onerror = function (e) { reject(e) }
xhr.onreadystatechange = function () {
if (xhr.status = 200)
resolve(xhr.response)
}
xhr.open(request.method, URL, request.sync);
xhr.timeout = request.timeout;
xhr.responseType = request.responseType;
//补充其他请求信息
//...
xhr.send();
}
XFetch(makeRequest('https://time.geekbang.org'),
function resolve(data) {
console.log(data)
}, function reject(e) {
console.log(e)
})
var x1 = XFetch(makeRequest('https://time.geekbang.org/?category'))
var x2 = x1.then(value => {
console.log(value)
return XFetch(makeRequest('https://www.geekbang.org/column'))
})
var x3 = x2.then(value => {
console.log(value)
return XFetch(makeRequest('https://time.geekbang.org'))
})
x3.catch(error => {
console.log(error)
})
async/await
实战:
- promise 的状态有哪些 ?
- promise 跟 async await 的区别,使用场景 ?
- Promise 和 async/await,和 Callback 有什么区别?
- Promise.resolve(obj),obj 有几种可能
- Promise 构造函数是同步还是异步执行,then 呢
- Promise 和 setTimeout 的区别
- Promise 有没有解决异步的问题
- promise 里面和 then 里面执行有什么区别
- promise 如何实现 then 处理,动手实现 then
- 实现 Promise.all
- 介绍下 promise 的特性、优缺点,内部是如何实现的,动手实现 Promise
- Day95:Promise.all中任何一个Promise出现错误的时候都会执行reject,导致其它正常返回的数据也无法使用。你有什么解决办法么?
- Day121:说一下 在 map 中和 for 中调用异步函数的区别
- Day127:按要求完成 mergePromise 代码
- Day153:Promise.resolve(obj),obj 有几种可能
- Async/Await 怎么实现
- 对 async、await 的理解,内部原理是怎样的?
- Async 里面有多个 await 请求,可以怎么优化
- async、await 如何进行错误捕获
- script 的 async 跟 defer 的区别?
- 简单封装一个异步 fecth,使用 async await 的方式来使用
- 第 1 题:写一个 mySetInterVal(fn, a, b),每次间隔 a,a+b,a+2b,…,a+nb 的时间,然后写一个 myClear,停止上面的 mySetInterVal