|
0.006秒,不是真实的耗时。没等网络请求返回数据,就已经先执行了耗时计算及显示。
另外,重新审视了您的代码,发现我的理解有误,您的代码,也类似于并发执行(跟Promise.all处理的时间相当),即没等待返回结果,就循环到下一次调用,不过,最终返回结果的时序很有趣,有可能后面的数据先返回
下面的代码可以证实:
- async function GetHTMLAsync(rng, t1){
- const url = "http://cx.jzsjyksy.com/queryPost";
- const data = `id=24&code=${rng.Value2.flat().join('|')}`;
- const options = {
- method: "POST",
- headers: {
- "Content-Type": "application/x-www-form-urlencoded"
- },
- body: data
- }
- let response = await fetch(url,options);
- let htmltext = await response.text();
- let res = htmltext.match(/(?<=var data = ")(.+)(?=";)/)[0].split(',').slice(3);
- // rng.Offset(0, 3).Resize(1,res.length).Value2 = res;
- rng.Offset(0, 3).Resize(1, 1).Value2 = (new Date() - t1); //耗时写入单元格,单位毫秒数
- async function 获取中考成绩(){
- console.clear();
- let t1 = new Date();
- for(let rng of ThisWorkbook.Sheets(1).Cells(1).CurrentRegion.Columns(1).Cells){
- if(rng.Row>1) GetHTMLAsync(rng.Resize(1,3), t1);
- }
- console.log(`耗时:${new Date() - t1} 毫秒`)
- }
复制代码
【 function 获取中考成绩() 】函数改写如下,即为串行执行了,不改变返回结果的时序,但运行时间慢于并行(并发)执行的时间:
- async function 获取中考成绩(){
- console.clear();
- let t1 = new Date();
- for(let rng of ThisWorkbook.Sheets(1).Cells(1).CurrentRegion.Columns(1).Cells){
- if(rng.Row>1) await GetHTMLAsync(rng.Resize(1,3), t1);
- }
- console.log(`耗时:${new Date() - t1} 毫秒`)
- }
复制代码
其实用网络请求并返回数据来检验,并不准确,更准确的办法,应使用 [color=var(--code-token-attribute-name)]setTimeout 来模拟。另外,并发执行可以显著提高效率,但效率也没有我之前说的那么夸张,跟运行环境和应用场景有关。
参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/async_function#%E7%A4%BA%E4%BE%8B
|
|