当前位置: 首页 > news >正文

律师网站建设与维护东方资产营销网站

律师网站建设与维护,东方资产营销网站,wordpress自定义搜索页面,展厅设计上海前提: 先说一下Promise解释 Promise是一种在JavaScript中处理异步操作的对象。它代表了一个尚未完成但承诺未来某个时间会完成的操作结果。Promise有三种状态:pending(等待中)、fulfilled(已成功)和reject…

前提:

 先说一下Promise解释

Promise是一种在JavaScript中处理异步操作的对象。它代表了一个尚未完成但承诺未来某个时间会完成的操作结果。Promise有三种状态:pending(等待中)、fulfilled(已成功)和rejected(已失败)。当一个Promise创建后,它可以转换到这三种状态之一,并触发对应的回调函数。

.then()方法用于注册成功处理函数,如果Promise解析(fulfillment),这个函数会被调用并传入解析后的值。
.catch()方法则用于注册错误处理函数,当Promise被拒绝(rejection)时,这个函数会被调用,接收拒绝的原因。
使用.finally()可以在无论Promise是否成功都会执行的代码块,通常用于清理工作。
通过链式调用then和catch,可以使异步代码看起来更像同步代码,提高了代码的可读性和维护性。例如:

let promise = someAsyncFunction();
promise.then(result => {// 成功处理
}).catch(error => {// 失败处理
}).finally(() => {// 执行最终清理
});

正文:

我的理解:

  1. async的作用是定义这个函数是异步:async 放在函数前的一个关键字,再函数内  return 1、return "1"、return new Promise(),外部打印这个函数都是获取到的是一个promise对象,通过函数.then获取到return的值。
  2. await的作用是等待 :  如果等待的不是promise对象他不会阻塞后面的代码,反之他等待的是一个promise对象  则会阻塞后面的代码,用await在前面做修饰他会直接得到resolve里面是数据,这就是await的工作。

一、async 和 await 在干什么

  • async 是“异步”的简写,而 await 的意思是等待
  • async 用于申明一个 function 是异步的,而 await 等待某个操作完成
  • async/await 是一种编写异步代码的新方法。之前异步代码的方案是回调和 promise。
  • async/await 像 promise 一样,也是非阻塞的。
  • async/await 让异步代码看起来、表现起来更像同步代码。这正是其威力所在。

二、async 起什么作用

这个问题的关键在于,async 函数是怎么处理它的返回值的!

我们当然希望它能直接通过 return 语句返回我们想要的值,但是如果真是这样,似乎就没 await 什么事了。所以,写段代码来试试,看它到底会返回什么:

<script>  async function test(){return 'hello async';}let result = test();console.log(result);
</script>

输出的是一个 Promise 对象 

所以,async 函数返回的是一个 Promise 对象。async 函数(包含函数语句、函数表达式、Lambda表达式)会返回一个 Promise 对象,如果在函数中 return 一个直接量,async 会把这个直接量通过 Promise.resolve() 封装成 Promise 对象。

 async 函数返回的是一个 Promise 对象,所以在最外层不能用 await 获取其返回值的情况下,我们当然应该用原来的方式:then() 链来处理这个 Promise 对象,就像这样

async function test(){return 'hello async';}test().then((val) => {console.log(val);  //hello async })

现在回过头来想下,如果 async 函数没有返回值,又该如何?很容易想到,它会返回 Promise.resolve(undefined)。

联想一下 Promise 的特点——无等待,所以在没有 await 的情况下执行 async 函数,它会立即执行,返回一个 Promise 对象,并且,绝不会阻塞后面的语句。这和普通返回 Promise 对象的函数并无二致。

那么下一个关键点就在于 await 关键字了。

三、await 到底在等啥

因为 async 函数返回一个 Promise 对象,所以 await 可以用于等待一个 async 函数的返回值——这也可以说是 await 在等 async 函数,但要清楚,它等的实际是一个返回值。注意到 await 不仅仅用于等 Promise 对象,它可以等任意表达式的结果,所以,await 后面实际是可以接普通函数调用或者直接量的。所以下面这个示例完全可以正确运行。

function getSomething(){return "something";
}
async function testAsync(){return Promise.resolve('hello async');
}
async function test(){let v1 = await getSomething();let v2 = await testAsync();console.log(v1,v2);
}
test();
console.log('我执行了');//执行结果为:
//我执行了
//something,hello async

await 等到了要等的,然后呢

await 等到了它要等的东西,一个 Promise 对象,或者其它值,然后呢?我不得不先说,await 是个运算符,用于组成表达式,await 表达式的运算结果取决于它等的东西。

如果它等到的不是一个 Promise 对象,那 await 表达式的运算结果就是它等到的东西。

如果它等到的是一个 Promise 对象,await 就忙起来了,它会阻塞后面的代码,等着 Promise 对象 resolve,然后得到 resolve 的值,作为 await 表达式的运算结果。

看到上面的阻塞一词,心慌了吧……放心,这就是 await 必须用在 async 函数中的原因。async 函数调用不会造成阻塞,它内部所有的阻塞都被封装在一个 Promise 对象中异步执行。

四、作个简单的比较

then 链处理

function takeLongTime(){return new Promise((resolve) => {setTimeout(() => resolve('long time value'),1000);})
}
takeLongTime().then((v) => {console.log('get:',v);
})

如果改用 async/await 呢,会是这样。

function takeLongTime(){return new Promise((resolve) => {setTimeout(() => resolve('long time value'),1000);})
}
async function test(){let v = await takeLongTime();//等待异步操作的结果,阻塞后面代码的执行console.log(v);
}

假设一个业务,分多个步骤完成,每个步骤都是异步的,而且依赖于上一个步骤的结果。我们仍然用 setTimeout 来模拟异步操作:

a.同步代码执行对比

/** 传入参数n,表示这个函数执行的时间(毫秒)* 执行的结果是 n+200,这个值将用于下一步骤
*/  
function takeLongTime(n){return new Promise((resolve) => {setTimeout(() => resolve(n + 200),n);})
}
function step1(n){console.log(`step1 with ${n}`);return takeLongTime(n);
}
function step2(n){console.log(`step2 with ${n}`);return takeLongTime(n);
}
function step3(n){console.log(`step3 with ${n}`);return takeLongTime(n);
}//1.现在用 Promise 方式来实现这三个步骤的处理(then链式)。function doIt(){console.time('doIt');let time1 = 300;step1(time1).then((time2) => step2(time2)).then((time3) => step3(time3))  .then((result) => {console.log(`result is ${result}`);console.timeEnd("doIt");})
}doIt();//执行结果为:
//step1 with 300
//step2 with 500
//step3 with 700
//result is 900
//doIt: 1510.2490234375ms/*总结:输出结果 result 是 step3() 的参数 700 + 200 = 900。doIt() 顺序执行了三个步骤,一共用了 300 + 500 + 700 = 1500 毫秒,和 console.time()/console.timeEnd() 计算的结果一致。*/// 2.用 async/await 来实现呢,会是这样async function doIt() {console.time('doIt');let time1 = 300;let time2 = await step1(time1);//将Promise对象resolve(n+200)的值赋给time2let time3 = await step1(time2);let result = await step1(time3);console.log(`result is ${result}`);console.timeEnd('doIt');
}doIt();//执行结果为:
//step1 with 300
//step2 with 500
//step3 with 700
//result is 900
//doIt: 1512.904296875ms

b.现在把业务要求改一下,仍然是三个步骤,但每一个步骤都需要之前每个步骤的结果

/** 传入参数n,表示这个函数执行的时间(毫秒)* 执行的结果是 n+200,这个值将用于下一步骤
*/  
function takeLongTime(n){return new Promise((resolve) => {setTimeout(() => resolve(n + 200),n);})
}
function step1(n){console.log(`step1 with ${n}`);return takeLongTime(n);
}
function step2(m,n){console.log(`step2 with ${m} + ${n}`);return takeLongTime(m + n);
}
function step3(k,m,n){console.log(`step3 with ${k} + ${m} + ${n}`);return takeLongTime(k + m + n);
}// 1.这回先用 async/await 来写:async function doIt() {console.time('doIt');let time1 = 300;let time2 = await step1(time1);//将Promise对象resolve(n+200)的值赋给time2let time3 = await step2(time2,time1);let result = await step3(time3,time2,time1);console.log(`result is ${result}`);console.timeEnd('doIt');
}doIt();//执行结果为:
//step1 with 300
//step2 with 500 + 300
//step3 with 1000 + 500 + 300
//result is 2000
//doIt: 2916.655029296875ms// 2.用 Promise 方式实现(then链式)function doIt() {console.time('doIt');let time1 = 300;step1(time1).then((time2) => {return step2(time1,time2).then((time3) => [time1,time2,time3])//step3需要用到time1,time2,time3,因此需要返回}).then((times) => {let [time1,time2,time3] = times;return step3(time1,time2,time3)}).then((result) => {console.log(`result is ${result}`);console.timeEnd('doIt');})
}doIt();//执行结果为:
//step1 with 300
//step2 with 300 + 500
//step3 with 300 + 500 + 1000
//result is 2000
//doIt: 2919.49609375ms

  五、注意点

就目前来说,已经理解 async/await 了吧?但其实还有一些事情没提及——Promise 有可能 reject 啊,怎么处理呢?

await 命令后面的 Promise 对象,运行结果可能是 rejected,所以最好把 await 命令放在try...catch 代码块中。
 

async function myFunction() {try {await somethingThatReturnAPromise();} catch (err){console.log(err);}
}//另一种写法
async function myFunction() {await somethingThatReturnAPromise().catch(function(err) {console.log(err);})
}

六、实例

1、异步:如我希望以下代码按照第一、二、三、四步的顺序执行:

export default {name: 'Default',data() {return {id: ''};},created() {this.init();},methods: {init() {//第一步let res = this.getReportId();//第四步this.id = res;alert('4:' + this.id);},getReportId(scene) {let id = '';this.$api['report/getMyReports']({roleId:'gly'}).then(data => {if (data && data.length > 0) {//第二步id = data[0].reportId;alert('2:' + id);}});//第三步alert('3:' + id);return id;}}
};
</script>

执行的结果却是:

可以看到,ajax请求最后执行,其他部分按顺序先执行了。可以修改下ajax的return顺序再验证下这个结论:

<script>
export default {name: 'Default',data() {return {id: ''};},created() {this.init();},methods: {init() {//第一步let res = this.getReportId();//第四步this.id = res;alert('4:' + this.id);},getReportId(scene) {this.$api['report/getMyReports']({scene: 7,roleId: -1}).then(data => {if (data && data.length > 0) {//第二步alert('2:' + data[0].reportId);return data[0].reportId;}});}}
};
</script>

执行顺序:

这会导致我在最后一步(第四步)获取的结果不准确。常用的解决方法是把第四步的赋值操作放到第二步中,即接口响应数据了再赋值。下面用另一种方法,代码同步方法来实现:

2、ajax请求同步方法:

<script>
export default {name: 'Default',data() {return {id: ''};},created() {this.getReportIds();},methods: {getReportIds() {let _this = this;//第一步this.getReportId().then(function(result) {//第四步_this.id = result;alert('4:' + _this.id);});},async getReportId(scene) {let id = '';await this.$api['report/getMyReports']({roleId: 'gly'}).then(data => {if (data && data.length > 0) {//第二步id = data[0].reportId;alert('2:' + id);}});//第三步alert('3:' + id);return id;}}
};
</script>

执行结果:

http://www.yayakq.cn/news/993605/

相关文章:

  • 合江县住房建设规划局网站如何提高网站pr值
  • 淘客网站开发视频教程磁力链
  • 网站建设自wordpress连接上下文
  • 东莞代码网站建设阳江一中启业网
  • 潍坊做网站高端网站建设教学
  • 网站建设diy注册传媒公司需要的条件
  • dede网站漏洞北京装修设计师哪里找
  • 计算机网络技术网站建设方向做网站用什么软件啊
  • 网站怎么做反爬虫一个网站怎么做流量统计
  • 系部网站建设创新点如何推广自己的网店
  • 设计师素材网站e做一个网站需要服务器吗
  • 江苏网站建设教程近期国际新闻热点大事件
  • 做网站一个月工资网站建设1000元
  • 网站生成静态慢原因91关键词排名
  • wordpress 英文站微餐饮建站费用
  • 网站目标关键词seo优化网站
  • 怎么看网站创建者是谁WordPress轻论坛模板
  • 大岭山网站建设公司注册了域名怎么做网站
  • 外链发布网站建设工程是指哪些工程
  • 淘宝 做网站空间 条件安徽省建设监理协会网站
  • 网站栏目管理系统郑州代做网站
  • 前端作业做一个网站一套完整的app开发流程
  • 重庆大渡口营销型网站建设公司推荐网站建设公司专业公司
  • 做哪些网站比较赚钱方法上海杨浦区网站建设
  • 关于网站开发的评审时间安排网址查询ip地址方法
  • 企业标准型手机网站秦皇岛网站建设兼职
  • 在哪查网站备案cms网站制作
  • 网站域名怎么快速备案城乡建设部网站混凝土7天强度
  • 东莞整站排名肃宁网站建设价格
  • 商丘网络科技有限公司东莞seo建站咨询