时间:2021-05-18
今天研究一个小问题: 怎么拿到JavaScript异步函数的返回值?
1.错误尝试
当年未入行时,我的最初尝试:
<script>function getSomething() { var r = 0; setTimeout(function() { r = 2; }, 10); return r;}function compute() { var x = getSomething(); alert(x * 2);}compute();</script>2.回调函数
弹出的不是4,而是0,后来知道这是异步的问题,
要用回调技术来做:
<script>function getSomething(cb) { var r = 0; setTimeout(function() { r = 2; cb(r); }, 10);}function compute(x) { alert(x * 2);}getSomething(compute);</script>3.promise
回调函数真是个好东西,然后一直这么写代码写了很久。遇到异步就传函数!!后来我知道有promise这一个东西,专门解决由于回调函数引起的问题,又学会了promise:
<script>function getSomething() { var r = 0; return new Promise(function(resolve) { setTimeout(function() { r = 2; resolve(r); }, 10); });}function compute(x) { alert(x * 2);}getSomething().then(compute);</script>promise仍然没有放弃回调,只是回调的位置发生了改变。
4.generator
再后来我又学会了generator,知道其有中断函数执行的能力,又做了新的尝试:
<script>function getSomething() { var r = 0; setTimeout(function() { r = 2; it.next(r); }, 10);}function *compute(it) { var x = yield getSomething(); alert(x * 2);}var it = compute();it.next();</script>同步的写法,能实现异步的逻辑,感觉高大上了很多。
5.promise + generator
后来又听说promise加generator,才是异步的完美方式,赶紧用高射炮打蚊子(这个例子,还不足以说出二者在一起用的好处):
<script>function getSomething() { var r = 0; return new Promise(function(resolve) { setTimeout(function() { r = 2; resolve(r); }, 10); });}function *compute() { var x = yield getSomething(); alert(x * 2);}var it = compute();it.next().value.then(function(value) { it.next(value);});</script>6.async
心想这算是够屌的吧,后来又听说es7给出了终极方案:async。
作为爱学习的少年,心想自己不能被落下:
<script>function getSomething() { var r = 0; return new Promise(function(resolve) { setTimeout(function() { r = 2; resolve(r); }, 10); });}async function compute() { var x = await getSomething(); alert(x * 2);}compute();</script>到这里终于长出了一口气。
后记:
上面所有的例子,在最新chrome上都可以运行。一个个小例子,点了点几个名词。
当然也只是“点”而已,如果能提供读者深入学习相关知识点的一个trigger,那么老姚就心满意足了。
以上就是老姚童鞋给我们分享的全部内容了,希望对大家理解JavaScript异步函数能够有所帮助
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
01、函数参数和返回值的作用函数根据有没有参数以及有没有返回值,可以相互结合,共有四种:无参数无返回值无参数有返回值有参数无返回值有参数有返回值定义函数时候,是
C#异步方法返回void和Task的区别如果异步(async关键字)方法有返回值,返回类型为T时,返回类型必然是Task。但是如果没有返回值,异步方法的返回类型
本文实例分析了Ajax异步提交数据返回值的换行问题。分享给大家供大家参考,具体如下:前面分析介绍了《Javascript基于AJAX回调函数传递参数》及《IE浏
1shuffle函数与其他函数不一样的地方shuffle函数没有返回值!shuffle函数没有返回值!shuffle函数没有返回值!仅仅是实现了对list元素进
含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)该函数的含义如下:IF条件=值1THEN RETURN(翻译值