
发表日期: 2021-05-20 13:49:38 浏览次数:111
东平400电话申请开通【东平企业网站建设】东平微信公众号小程序开发运营价格、东平微信公众号APP软件客户端设计运营、东平网页页面设计公司费用、东平公司网站制作方案流程改版维护大概需要多少钱

东平县,隶属于山东省泰安市,位于鲁西南,西临黄河,东望泰山,总面积1343平方千米。 [1]
东平县历史悠久,境内黄河、大运河、大汶河三河交汇,大汶口文化、宗教文化、名人文化、渔家文化、民俗文化等相互交融,“运河之心”戴村坝被列为世界文化遗产 [2] 。东平地处黄河、京杭大运河、大汶河交汇处,是水浒文化的发祥地,全县共有自然、人文景观400余处,其中国家级景区、景点5处。境内的东平湖是山东省第二大淡水湖、国家南水北调东线工程的重要枢纽,也是“八百里水泊”的唯一遗存水域。 [3]
2019年,东平县下辖3个街道、9个镇、2个乡 [4] 。2019年,实现地区生产总值207.37亿元,按可比价格计算,同比增长5.0%。其中,第一产业增加值48.36亿元,下降1.01%;第二产业增加值68.97亿元,增长1.85%;第三产业增加值90.04亿元,增长11.47%。三次产业结构为23.3:33.3:43.4。人均生产总值为27212元,增长5.1%。 [5]
最近在写一个Node.js程序,功能是下载页面上的资源,首先拿到页面资源链接列表,如:
[ 'https://xxx.com/img/logo.jpg', 'https://xxx.com/img/bg.jpg', 'https://xxx.com/css/main.css', 'https://xxx.com/css/animate.css', 'https://xxx.com/js/jquery.js', 'https://xxx.com/js/form.js', ... ]
要求是资源并行下载,所有资源下载结束后通知,收集错误的下载链接。
如果是传统做法是遍历数组发送请求,声明一个变量记录请求数,不管成功或失败,结束后都给这个变量+1,并且调用一个函数,这个函数判断当前变量是否等于数组长度,相等则表示所有请求已经完成。
// pseudo codevar count = 0var errs = []var data = [...]function request(url) {
ajax({url: url})
.success(function () {
count++
callback()
})
.fail(function () {
count++
errs.push(...)
callback()
})
}function callback() { if (count === data.length) { console.log('done!')
}
}
data.forEach(request)因为请求是异步的,我们也无法确定每个请求花费的时间,所以只能在回调里处理。现在我们有了Promise,async-await,支持同步的写法,那可以怎么写呢?
我们用setTimeout来模拟请求,数据data = [500, 400, 300, 200, 100]既是每个请求返回的数据也是每个请求所需的时间。
如果是继发请求(一个请求结束后再请求后一个),那么应该是按顺序打印,理论上所有请求的总时间等于每个请求所花时间之和,约等于1500ms;如果是并发请求(假设请求数不会太多,不超过限制),顺序是按时间从小到大打印,理论上所有请求的总时间等于最长的那个时间,约等于500ms。
首先先看下怎么并行请求和请求结束确定
// 模拟请求function request(param) { return new Promise(resolve => {
setTimeout(() => { console.log(param)
resolve()
}, param)
})
}const items = [500, 400, 300, 200, 100]✘ 直接for循环
(() => { for (let item of items) {
request(item)
} console.log('end')
})()// 输出:end, 100, 200, 300, 400, 500上面的输出可以看出,请求是并行的,但是无法确定什么结束
✘ for循环,使用async-await
(async () => { for (let item of items) { await request(item)
} console.log('end')
})()// 输出:500, 400, 300, 200, 100, end上面的代码可以看出,虽然确定了结束,但请求是继发的
✔ 使用Promise.all
(() => { Promise.all(items.map(request)).then(res => { console.log('end')
})
})()// 输出:100, 200, 300, 400, 500, end上面的代码可以看出,请求是并发的,并且在所有请求结束后打印end,满足条件
我们不能保证所有的请求都是正常的,接下来看看当有请求出错时怎么处理,假设200的请求出错
function request(param) { return new Promise((resolve, reject) => {
setTimeout(() => { if (param === 200) { // console.log(param, ' failed')
return reject({ status: 'error', data: param
})
} // console.log(param, ' success')
resolve({ status: 'success', data: param
})
}, param)
})
}const items = [500, 400, 300, 200, 100]Promise有catch方法捕获错误,最近新增的finally方法能在最后执行
(() => { Promise.all(items.map(request))
.then(res => { console.log(res)
})
.catch (err => { console.log(err)
})
.finally(res => { console.log('end', res)
})
})()// 输出 {status: "error", data: 200}, end, undefined上面的输出可以看出,如果有错误,则不会进入then,而是进入catch,然后进入finally,但是finally不接受参数,只告诉你结束了。如果把上面模拟请求的console.log(...)注释去掉,还会发现finally是在catch结束后就执行了,而200后面的请求还未结束。
接下来我们改造下模拟请求,在请求出错后就catch错误
function request(param) { return new Promise((resolve, reject) => {
setTimeout(() => { if (param === 200) { // console.log(param, ' failed')
return reject({ status: 'error', data: param
})
} // console.log(param, ' success')
resolve({ status: 'success', data: param
})
}, param)
}).catch(err => err)
}
(() => { Promise.all(items.map(request))
.then(res => { console.log(res, 'end')
})
})()// 输出 [{…}, {…}, {…}, {stauts: 'error', data: 200}, {…}], end这样就可以在then中拿到全部的结果了,如果要用for循环的话也是可以的
(async () => { const temp = [] // 这个for循环的作用和上面的map类似
for (let item of items) {
temp.push(request(item))
} const result = [] for (let t of temp) {
result.push(await t)
} console.log(result, 'end')
})()// 输出与上面一致第一个for循环保证并发请求,保存了Promise,第二个循环加入await保证按顺序执行。
东平400电话申请开通【东平企业网站建设】东平微信公众号小程序开发运营价格、东平微信公众号APP软件客户端设计运营、东平网页页面设计公司费用、东平公司网站制作方案流程改版维护大概需要多少钱
服务热线
顶部
备案号: 苏ICP备11067224号
CopyRight © 2011 书生商友信息科技 All Right Reserved
24小时服务热线:400-111-6878 E-MAIL:1120768800@qq.com QQ:1120768800
网址: http://www.768800.com 网站建设:上往建站
关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|
企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|
400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 苏州殡葬一条龙| 朝阳殡葬| 苏州殡葬服务|
欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系
服务热线:400-111-6878