首先是 async/await
这东西跟 Promise
的关系搞清楚
用 Promise 来封装 ajax 之后, 可以比较省事:
async function fetchData() {
let result = await ajax('/url')
//...
}
代码省事了,也好看
但是如果有多个 ajax,怎么办?
async function doSth() {
let result = await ajax('/url')
let result2 = await ajax('/url2')
//...
}
嗯,也可以,但是如果这俩 ajax 没什么关系,那就没必要等待了,可以一次完成,用 Promise.all
async function doSth() {
let [result, result2] = await Promise.all([ajax('/url'), ajax('/url2')])
//...
}
再来一个,部分请求,可能有,可能没有,这几个请求,没有太大的关联,但是等都完成之后,还要继续操作
async function doSth() {
let ps = []
let param1 = null
let param2 = null
// 这里有其他代码来处理参数
let result1 = null
let resule2 = null
if (param1) {
ps.push(
ajax('/url', param1).then(result => {
//
result1 = result
})
)
}
if (param2) {
ps.push(
ajax('/url2', param2).then(result => {
//
result2 = result
})
)
}
await Promise.all(ps)
//...
// 甭管有几个,等都完成了,继续执行
}
自己这段时间一直觉得好像 async/await 才是未来, 尽量避免 promise.then 的写法
然后遇到上面最后这个需求, 结果发现如果不用 then ,代码就好别扭,为了实现不用 then,特意做了一个假的 ajax,然后还加了一堆判断
function fetchData(url, param) {
if (url) {
return ajax(url, param)
} else {
return Promise.resolve(fakeResult)
}
}
async function doSth() {
let param1 = null
let param2 = null
// 这里有其他代码来处理参数
let [result1, result2] = await Promise.all([ajax(param1 ? '/url' : null), ajax(param2 ? '/url2' : null)])
if (result1) {
//balabala
}
if (result2) {
//balabala
}
}
这份代码太搓了, 为了 async 而 async, 本末倒置了