获取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 相关文章推荐
子窗口、父窗口和Silverlight之间的相互调用
Aug 16 Javascript
.net,js捕捉文本框回车键事件的小例子(兼容多浏览器)
Mar 11 Javascript
JavaScript实现简单的时钟实例代码
Nov 23 Javascript
js获取当前页面的url网址信息
Jun 12 Javascript
jQuery获得document和window对象宽度和高度的方法
Mar 25 Javascript
chrome调试javascript详解
Oct 21 Javascript
javascript表达式和运算符详解
Feb 07 Javascript
Js apply方法详解
Feb 16 Javascript
以BootStrap Tab为例写一个前端组件
Jul 25 Javascript
vue2.0 常用的 UI 库实例讲解
Dec 12 Javascript
详解基于vue的服务端渲染框架NUXT
Jun 20 Javascript
微信小程序关键字变色实现代码实例
Dec 13 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中error_reporting()函数的用法(修改PHP屏蔽错误)
2011/07/01 PHP
php以post形式发送xml的方法
2014/11/04 PHP
PHP 实现链式操作
2021/03/09 PHP
基于jquery的checkbox下拉框插件代码
2010/06/25 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
2011/11/14 Javascript
JavaScript的递归之递归与循环示例介绍
2013/08/05 Javascript
js调用后台、后台调用前台等方法总结
2014/04/17 Javascript
AngularJs自定义服务之实现签名和加密
2016/08/02 Javascript
JavaScipt选取文档元素的方法(推荐)
2016/08/05 Javascript
js H5 canvas投篮小游戏
2016/08/18 Javascript
自制微信公众号一键排版工具
2016/09/22 Javascript
ComboBox(下拉列表框)通过url加载调用远程数据的方法
2017/08/06 Javascript
AngularJS中控制器函数的定义与使用方法示例
2017/10/10 Javascript
vue 通过下拉框组件学习vue中的父子通讯
2017/12/19 Javascript
vue使用Proxy实现双向绑定的方法示例
2019/03/20 Javascript
Ant design vue中的联动选择取消操作
2020/10/31 Javascript
vue watch监控对象的简单方法示例
2021/01/07 Vue.js
[26:21]浴火之凤-TI4世界冠军Newbee战队纪录片
2014/08/07 DOTA
[55:45]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.24
2019/09/10 DOTA
Python中装饰器的一个妙用
2015/02/08 Python
python下载文件时显示下载进度的方法
2015/04/02 Python
在Python中使用lambda高效操作列表的教程
2015/04/24 Python
Python os.access()用法实例
2019/02/18 Python
Python minidom模块用法示例【DOM写入和解析XML】
2019/03/25 Python
在Python中预先初始化列表内容和长度的实现
2019/11/28 Python
TensorFlow Autodiff自动微分详解
2020/07/06 Python
Python3爬虫中Selenium的用法详解
2020/07/10 Python
python递归函数用法详解
2020/10/26 Python
CSS3毛玻璃效果(blur)有白边问题的解决方法
2016/11/15 HTML / CSS
应届生会计求职信
2013/11/11 职场文书
商场端午节活动方案
2014/01/29 职场文书
绿化工程实施方案
2014/03/17 职场文书
幼儿园卫生保健制度
2015/08/05 职场文书
班主任远程培训研修日志
2015/11/13 职场文书
python中pymysql包操作数据库方法
2022/04/19 Python
nginx之queue的具体使用
2022/06/28 Servers