工作中Promise用法总结,后面会持续更新觉得有意义的。
1.构造Promise
一般情况下代码是这样的:
async function fn() {return new Promise((resolve, reject) => {let list = []resolve(list)}
}await fn()
最后的返回值,如果promise的状态是成功,则会返回
2.连环写法
在回调中写,res中写下一个promise。这样的做法可以保证执行顺序。
当然,async,await也是可以的。但是需要值去接收,去判断。
这种也是比较适合顺序去执行的。其实也可以用第三种写法
async function getGoodsInfo(goodsLink) {return new Promise((resolve, reject) => {let goods_id = []xxxAPI({"query": {"sign": geneSignStr(),"content": goodsLink,"type": "1"}}, res => {console.log("type1", res.data.goods_id)goods_id.push(res.data.goods_id)xxxAPI({"query": {"sign": geneSignStr(),"content": goodsLink,"type": "2"}}, res1 => {goods_id.push(res1.data.goods_id)console.log("type2", res1.data.goods_id)xxxAPI({"query": {"sign": geneSignStr(),"content": goodsLink,"type": "3"}}, res2 => {console.log("type3", res2.data.goods_id)goods_id.push(res2.data.goods_id)resolve(goods_id)})})})})
}
3.promise.all()
这里给出一个环境,比如我有一个100个数据的列表,100个数据上面需要展示时间进度,项目进度什么的,然后项目进度需要id去请求,也就是说,要请求100次。
如果我们用同步的写法,这个数据肯定是不稳定的,并且会时刻变化。
做法就是,遍历这一百个数据,在循环中拿到id,然后调取接口,给对象赋值(正常操作)。最关键来了,循环内部需要是一个promise对象,请求成功的话是一个resolve,然后需要做的,因为循环遍历了100次,找一个数组,把每一次请求都push进去。最后用async Promise(arr)来执行,如果说所有的请求都成功,最后返回值就是整个处理过后的对象。如果返回失败,我们可以用catch去抓取失败。
整个思路是这样,那我们看看代码:
// 获取项目进度-并发
async function getProjectProgressAll(list) {let tasks = [] //这个数组存放多个promisefor(let item of list) {// 遍历对象数组let p = new Promise((resolve, reject) => {xxxAPI.getDaihuoAnalysisData({params: {"daihuo_project_id": item.project_id}}, res => {if (res.result && res.result.excel_data && res.result.excel_data) {xxx} else {xxx }})resolve()})p.then(() => {tasks.push(p)}).catch((err) => {console.log(err)})}await Promise.all(tasks)return list
}