获取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 伪数组实现方法
Oct 11 Javascript
配置Grunt的Task时通配符支持和动态生成文件名问题
Sep 06 Javascript
CSS3 3D 技术手把手教你玩转
Sep 02 Javascript
canvas绘图不清晰的解决方案
Feb 28 Javascript
javascript实现QQ空间相册展示源码
Dec 12 Javascript
JS获取当前时间的实例代码(昨天、今天、明天)
Nov 13 Javascript
面试题:react和vue的区别分析
Apr 08 Javascript
Layui 导航默认展开和菜单栏选中高亮设置的方法
Sep 04 Javascript
基于react项目打包css引用路径错误解决方案
Oct 28 Javascript
JavaScript实现随机点名小程序
Oct 29 Javascript
在elementui中Notification组件添加点击事件实例
Nov 11 Javascript
微信小程序实现点击导航条切换页面
Nov 19 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生成zip压缩文件的方法详解
2013/06/09 PHP
解析zend Framework如何自动加载类
2013/06/28 PHP
PHP命名空间(namespace)的使用基础及示例
2014/08/18 PHP
thinkphp文件引用与分支结构用法实例
2014/11/26 PHP
PHP多进程编程实例详解
2017/07/19 PHP
PHP判断是否是微信打开,浏览器打开的方法
2018/03/14 PHP
JavaScript编程开发中的五个实用小技巧
2010/07/22 Javascript
如何使用jQuery来处理图片坏链具体实现步骤
2013/05/02 Javascript
Firefox中通过JavaScript复制数据到剪贴板(Copy to Clipboard 跨浏览器版)
2013/11/22 Javascript
javascript使用数组的push方法完成快速排序
2014/09/15 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
2016/04/15 Javascript
jquery attr()设置和获取属性值实例教程
2016/09/25 Javascript
Javascript this 函数深入详解
2016/12/13 Javascript
webpack vue项目开发环境局域网访问方法
2018/03/20 Javascript
vue select组件的使用与禁用实现代码
2018/04/10 Javascript
Vue常用的几个指令附完整案例
2018/11/06 Javascript
vue 左滑删除功能的示例代码
2019/01/28 Javascript
微信小程序websocket实现即时聊天功能
2019/05/21 Javascript
JS实现横向轮播图(初级版)
2020/06/24 Javascript
如何利用JS将手机号中间四位变成*号
2020/09/29 Javascript
python pycurl验证basic和digest认证的方法
2018/05/02 Python
Python从文件中读取数据的方法讲解
2019/02/14 Python
Python Django的安装配置教程图文详解
2019/07/17 Python
python读写csv文件并增加行列的实例代码
2019/08/01 Python
python编程进阶之类和对象用法实例分析
2020/02/21 Python
Python基于gevent实现高并发代码实例
2020/05/15 Python
浅谈pymysql查询语句中带有in时传递参数的问题
2020/06/05 Python
全球知名提供各类营养保健品的零售商:Vitamin Shoppe
2016/10/09 全球购物
简述DNS进行域名解析的过程
2013/12/02 面试题
商场促销活动方案
2014/02/08 职场文书
法人授权委托书
2014/04/03 职场文书
多媒体编辑专业毕业生求职信
2014/06/13 职场文书
处级领导班子全部召开专题民主生活会情况汇报
2014/09/27 职场文书
2014年药剂科工作总结
2014/11/26 职场文书
初婚初育证明范本
2015/06/18 职场文书
python中__slots__节约内存的具体做法
2021/07/04 Python