获取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 导出数据到Excel(处理table中的元素)
Dec 18 Javascript
juqery 学习之三 选择器 层级 基本
Nov 25 Javascript
根据表格中的某一列进行排序的javascript代码
Nov 29 Javascript
jQuery实现字符串按指定长度加入特定内容的方法
Mar 11 Javascript
JavaScript基于ajax编辑信息用法实例
Jul 15 Javascript
深入理解Javascript中的观察者模式
Feb 20 Javascript
vue实现文章内容过长点击阅读全文功能的实例
Dec 28 Javascript
js提取中文拼音首字母的封装工具类
Mar 12 Javascript
详解使用vue-admin-template的优化历程
May 20 Javascript
axios使用拦截器统一处理所有的http请求的方法
Nov 02 Javascript
vue项目中全局引入1个.scss文件的问题解决
Aug 01 Javascript
Layui实现数据表格中鼠标悬浮图片放大效果,离开时恢复原图的方法
Sep 11 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
在“咖啡之国”感受咖啡文化
2021/03/03 咖啡文化
查找mysql字段中固定字符串并替换的几个方法
2012/09/23 PHP
修改destoon会员公司的伪静态中的com目录的方法
2014/08/21 PHP
PHP基于cookie与session统计网站访问量并输出显示的方法
2016/01/15 PHP
php flush无效,IIS7下php实时输出的方法
2016/08/25 PHP
thinkPHP5项目中实现QQ第三方登录功能
2017/10/20 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
Web前端设计模式  制作漂亮的弹出层
2010/10/29 Javascript
JQuery插件Quicksand实现超炫的动画洗牌效果
2015/05/03 Javascript
javascript高级编程之函数表达式 递归和闭包函数
2015/11/29 Javascript
Node.js编写组件的三种实现方式
2016/02/25 Javascript
JavaScript常用函数工具集:lao-utils
2016/03/01 Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
2019/05/02 Javascript
vue实现滑动到底部加载更多效果
2020/10/27 Javascript
Node.js爬虫如何获取天气和每日问候详解
2019/08/26 Javascript
JS实现拖动模糊框特效
2020/08/25 Javascript
Openlayers绘制地图标注
2020/09/28 Javascript
vue实现列表拖拽排序的功能
2020/11/02 Javascript
[00:13]天涯墨客二技能展示
2018/08/25 DOTA
简单学习Python time模块
2016/04/29 Python
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
2016/06/03 Python
Django Highcharts制作图表
2016/08/27 Python
Python实现复杂对象转JSON的方法示例
2017/06/22 Python
Python中的上下文管理器相关知识详解
2019/09/19 Python
python3中利用filter函数输出小于某个数的所有回文数实例
2019/11/24 Python
Pycharm如何运行.py文件的方法步骤
2020/03/03 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
2020/04/22 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
matplotlib交互式数据光标mpldatacursor的实现
2021/02/03 Python
html5-Canvas可以在web中绘制各种图形
2012/12/26 HTML / CSS
Expedia韩国官网:亚洲发展最快的在线旅游门户网站
2018/02/26 全球购物
致跳远运动员加油稿
2014/02/11 职场文书
元旦晚会感言
2014/03/12 职场文书
计算机毕业生求职信
2014/06/10 职场文书
2014党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
运动会跳远广播稿
2015/08/19 职场文书