获取JavaScript异步函数的返回值


Posted in Javascript onDecember 21, 2016

今天研究一个小问题: 怎么拿到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

心想这算是够?诺陌桑?罄从痔??s7给出了终极方案: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异步函数能够有所帮助

Javascript 相关文章推荐
javascript实现的动态添加表单元素input,button等(appendChild)
Nov 24 Javascript
jQuery 选择器、DOM操作、事件、动画
Nov 25 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
Jan 09 Javascript
jquery中插件实现自动添加用户的具体代码
Nov 15 Javascript
一个JavaScript去除字符串末尾的空白实例代码
Sep 22 Javascript
JS实现的生成随机数的4个函数分享
Feb 11 Javascript
如何用javascript计算文本框还能输入多少个字符
Jul 29 Javascript
vue父子组件的数据传递示例
Mar 07 Javascript
vue实现倒计时获取验证码效果
Apr 17 Javascript
原生JS实现萤火虫效果
Mar 07 Javascript
JS实现滑动拼图验证功能完整示例
Mar 29 Javascript
JavaScript 几种循环方式以及模块化的总结
Sep 03 Javascript
bootstrap实现图片自动轮播
Dec 21 #Javascript
详解JavaScript时间处理之几个月前或几个月后的指定日期
Dec 21 #Javascript
详解前端自动化工具gulp自动添加版本号
Dec 20 #Javascript
详解Vue.js动态绑定class
Dec 20 #Javascript
浅谈Angular的$q, defer, promise
Dec 20 #Javascript
BootStrapTable服务器分页实例解析
Dec 20 #Javascript
bootstrap实现每隔5秒自动轮播效果
Dec 20 #Javascript
You might like
PHP设计聊天室步步通
2006/10/09 PHP
MySql中正则表达式的使用方法描述
2008/07/30 PHP
thinkPHP数据库增删改查操作方法实例详解
2016/12/06 PHP
php出租房数据管理及搜索页面
2017/05/23 PHP
PHP设计模式之适配器模式原理与用法分析
2018/04/25 PHP
PHP内置函数生成随机数实例
2019/01/18 PHP
PHP addcslashes()函数讲解
2019/02/03 PHP
用javascript获得地址栏参数的两种方法
2006/11/08 Javascript
不用MOUSEMOVE也能滑动啊
2007/05/23 Javascript
js正文内容高亮效果的实现方法
2013/06/30 Javascript
html的DOM中document对象images集合用法实例
2015/01/21 Javascript
javascript实现字符串反转的方法
2015/02/05 Javascript
jquery实现列表上下移动功能
2016/02/25 Javascript
BootStrap智能表单demo示例详解
2016/06/13 Javascript
原生JS实现几个常用DOM操作API实例
2017/01/19 Javascript
AngularJS实现使用路由切换视图的方法
2017/01/24 Javascript
Spring Boot/VUE中路由传递参数的实现代码
2018/03/02 Javascript
jquery实现搜索框功能实例详解
2018/07/23 jQuery
利用JavaScript的Map提升性能的方法详解
2019/08/14 Javascript
react国际化化插件react-i18n-auto使用详解
2020/03/31 Javascript
angula中使用iframe点击后不执行变更检测的问题
2020/05/10 Javascript
微信小程序开发(一):服务器获取数据列表渲染操作示例
2020/06/01 Javascript
用Python中的__slots__缓存资源以节省内存开销的方法
2015/04/02 Python
Python模块搜索概念介绍及模块安装方法介绍
2015/06/03 Python
对Python 数组的切片操作详解
2018/07/02 Python
Python中函数的基本定义与调用及内置函数详解
2019/05/13 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
Python + OpenCV 实现LBP特征提取的示例代码
2019/07/11 Python
python实现手势识别的示例(入门)
2020/04/15 Python
python基于pexpect库自动获取日志信息
2021/02/01 Python
FOREO斐珞尔官方旗舰店:LUNA露娜洁面仪
2018/03/11 全球购物
总经理工作职责范文
2014/03/14 职场文书
廉洁自律承诺书
2014/03/27 职场文书
外贸会计专业自荐信
2014/06/22 职场文书
大学辅导员述职报告
2015/01/10 职场文书
军训后的感想
2015/08/07 职场文书