获取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 相关文章推荐
jQuery实战之品牌展示列表效果
Apr 10 Javascript
分享XmlHttpRequest调用Webservice的一点心得
Jul 20 Javascript
jQuery学习之prop和attr的区别示例介绍
Nov 15 Javascript
JS中Date日期函数中的参数使用介绍
Jan 02 Javascript
Javascript实现计算个人所得税
May 10 Javascript
javascript+css3 实现动态按钮菜单特效
Feb 06 Javascript
jQuery自定义图片缩放拖拽插件imageQ实现方法(附demo源码下载)
May 27 Javascript
layer弹出层框架alert与msg详解
Mar 14 Javascript
微信小程序 刷新上拉下拉不会断详细介绍
May 11 Javascript
vue组件之Alert的实现代码
Oct 17 Javascript
iview中Select 选择器多选校验方法
Mar 15 Javascript
js与jquery获取input输入框中的值实例讲解
Feb 27 jQuery
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 事务处理数据实现代码
2010/05/13 PHP
php判断文件夹是否存在不存在则创建
2015/04/09 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
2017/02/06 PHP
Laravel用户授权系统的使用方法示例
2018/09/16 PHP
基于jquery的让textarea自适应高度的插件
2010/08/03 Javascript
jQuery ready函数滥用分析
2011/02/16 Javascript
非主流的textarea自增长实现js代码
2011/12/20 Javascript
javascript两种function的定义介绍及区别说明
2013/05/02 Javascript
jQuery实现随意改变div任意属性的名称和值(部分原生js实现)
2013/05/28 Javascript
jquery 快速回到页首的方法
2013/12/05 Javascript
nodejs开发环境配置与使用
2014/11/17 NodeJs
全面解析Bootstrap图片轮播效果
2015/12/03 Javascript
AngularJS入门教程之控制器详解
2016/07/27 Javascript
Vue.js第二天学习笔记(vue-router)
2016/12/01 Javascript
nodejs学习笔记之路由
2017/03/27 NodeJs
深入探究node之Transform
2017/07/20 Javascript
mui back 返回刷新页面的实例
2017/12/06 Javascript
vue的全局变量和全局拦截请求器的示例代码
2018/09/13 Javascript
vue.js的简单自动求和计算实例
2019/11/08 Javascript
vue-property-decorator用法详解
2019/12/12 Javascript
extjs4图表绘制之折线图实现方法分析
2020/03/06 Javascript
npm ci命令的基本使用方法
2020/09/20 Javascript
Python的类实例属性访问规则探讨
2015/01/30 Python
python获取list下标及其值的简单方法
2016/09/12 Python
Python 判断是否为质数或素数的实例
2017/10/30 Python
python多线程下信号处理程序示例
2019/05/31 Python
使用pandas读取文件的实现
2019/07/31 Python
Python输出指定字符串的方法
2020/02/06 Python
Django模板标签{% for %}循环,获取制定条数据实例
2020/05/14 Python
小学教育毕业生自荐信
2013/11/18 职场文书
入党积极分子评语
2014/05/04 职场文书
供用电专业求职信
2014/07/07 职场文书
2014年敬老院工作总结
2014/12/08 职场文书
上课说话检讨书
2015/01/27 职场文书
2015年监理工作总结范文
2015/04/07 职场文书
小人国观后感
2015/06/11 职场文书