获取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 相关文章推荐
Flash+XML滚动新闻代码 无图片 附源码下载
Nov 22 Javascript
js获取url中的参数且参数为中文时通过js解码
Mar 19 Javascript
js获取ajax返回值代码
Apr 30 Javascript
使用cluster 将自己的Node服务器扩展为多线程服务器
Nov 10 Javascript
jQuery实现企业网站横幅焦点图切换功能实例
Apr 30 Javascript
基于jQuery实现选取月份插件附源码下载
Dec 28 Javascript
javacript获取当前屏幕大小
Jun 04 Javascript
JavaScript中数组Array.sort()排序方法详解
Mar 01 Javascript
vue.js之vue-cli脚手架的搭建详解
May 05 Javascript
JS实现身份证输入框的输入效果
Aug 21 Javascript
elementUI select组件默认选中效果实现的方法
Mar 25 Javascript
在vue中实现某一些路由页面隐藏导航栏的功能操作
Sep 21 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原理之错误抑制与内嵌HTML分析
2011/05/02 PHP
PHP获取windows登录用户名的方法
2014/06/24 PHP
PHP的几个常用加密函数
2016/02/03 PHP
javascript实现表格排序 编辑 拖拽 缩放
2015/01/02 Javascript
手机开发必备技巧:javascript及CSS功能代码分享
2015/05/25 Javascript
jQuery根据元素值删除数组元素的方法
2015/06/24 Javascript
jquery 仿锚点跳转到页面指定位置的实例
2017/02/14 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
2017/08/16 Javascript
VSCode配置react开发环境的步骤
2017/12/27 Javascript
jQuery实现的下雪动画效果示例【附源码下载】
2018/02/02 jQuery
js实现三角形粒子运动
2020/09/22 Javascript
react的hooks的用法详解
2020/10/12 Javascript
[02:12]探秘2016国际邀请赛中国区预选赛选手房间
2016/06/25 DOTA
[53:20]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 VG vs OG
2018/04/03 DOTA
pyramid配置session的方法教程
2013/11/27 Python
使用python将图片按标签分入不同文件夹的方法
2018/12/08 Python
Python3实现的反转单链表算法示例
2019/03/08 Python
Python3.5运算符操作实例详解
2019/04/25 Python
详解如何设置Python环境变量?
2019/05/13 Python
python如何实现视频转代码视频
2019/06/17 Python
Python统计分析模块statistics用法示例
2019/09/06 Python
Python turtle库绘制菱形的3种方式小结
2019/11/23 Python
Selenium关闭INFO:CONSOLE提示的解决
2020/12/07 Python
西班牙国家航空官方网站:Iberia
2017/11/16 全球购物
Marlies Dekkers内衣法国官方网上商店:国际知名的荷兰内衣品牌
2019/03/18 全球购物
英国123鲜花网站:123 Flowers
2019/07/07 全球购物
日本酒店、民宿、温泉旅馆、当地旅行团中文预订:e路东瀛
2019/12/09 全球购物
中职生自我鉴定范文
2013/10/03 职场文书
学校十一活动方案
2014/02/01 职场文书
应急管理工作总结2015
2015/05/04 职场文书
2015年科研工作总结范文
2015/05/13 职场文书
勤俭节约主题班会
2015/08/13 职场文书
推广普通话主题班会
2015/08/17 职场文书
导游词之台湾阿里山
2019/10/23 职场文书
Python中常见的反爬机制及其破解方法总结
2021/06/10 Python
Python可视化学习之matplotlib内置单颜色
2022/02/24 Python