问题描述:
- 我有很多的url要去取他们返回的json值,然后组合成一个json
- 有一个失败就全部失败
- 全部成功则返回值组合成新JSON
问题分析
- 很多的url假设有5个,如果1个耗时1秒,若果用同步ajax那么5个就是5秒,卡主界面,不合适
- 那只能采用异步,简单的回调明显不合适毕竟太多,而ajax采用的是jquery,解想到了采用Promise类给他封装一下
new Promise((resolve, reject) => {
$.ajax({
url: "./json数据/aa.json",
type: "get",
dataType: "json",
success: function (data) {
resolve(data)
},
error: function (err) {
return Promise.resolve(err)
}
})
})
解决方法
let bll = {
getPromiseObj(param) {
return new Promise((resolve, reject) => {
$.ajax({
url: param.url,
type: "get",
dataType: "json",
data: param.data,
success: function (data) {
resolve(data)
},
error: function (err) {
resolve(err)
}
})
})
},
ExcutePromiseAll: function (arr, callBackFunc) {
let arrparam = []
arr.forEach(a => {
arrparam.push(bll.getPromiseObj(a))
})
Promise.all(arrparam).then(data => {
let result = { err: "" };
arr.forEach((v, i) => {
result[v.name] = data[i]
})
callBackFunc(result)
}).catch(err => {
callBackFunc({ err: err })
})
}
}
let arrResultDic = [{
name: "jsonpro1",
url: "./json数据/aa.json",
data: {}
}, {
name: "jsonpro2",
url: "./json数据/bb.json",
data: {}
}, {
name: "jsonpro3",
url: "./json数据/cc.json",
data: {}
}]
bll.ExcutePromiseAll(arrResultDic, data => {
console.log("结果:", data)
})