获取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 相关文章推荐
使用Modello编写JavaScript类
Dec 22 Javascript
THREE.JS入门教程(3)着色器-下
Jan 24 Javascript
js实现适用于素材网站的黑色多级菜单导航条效果
Aug 24 Javascript
Bootstrap每天必学之按钮(Button)插件
Apr 25 Javascript
原生JS和jQuery操作DOM对比总结
Jan 19 Javascript
JS实现的走迷宫小游戏完整实例
Jul 19 Javascript
浅谈node模块与npm包管理工具
Jan 03 Javascript
Vue框架之goods组件开发详解
Jan 25 Javascript
详解angular路由高亮之RouterLinkActive
Apr 28 Javascript
重学JS 系列:聊聊继承(推荐)
Apr 11 Javascript
vue.js实现图书管理功能
Sep 24 Javascript
vue 实现element-ui中的加载中状态
Nov 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
从PHP $_SERVER相关参数判断是否支持Rewrite模块
2013/09/26 PHP
User Scripts: Video Download by User Scripts
2007/05/14 Javascript
js 发个判断字符串是否为符合标准的函数
2009/04/27 Javascript
jQuery 1.3 和 Validation 验证插件1.5.1
2009/07/09 Javascript
在IE下获取object(ActiveX)的Param的代码
2009/09/15 Javascript
写了10年的Javascript也未必全了解的连续赋值运算
2011/03/25 Javascript
jQuery点击tr实现checkbox选中的方法
2013/03/19 Javascript
JavaScript生成的动态下雨背景效果实现方法
2015/02/25 Javascript
jQuery实现预加载图片的方法
2015/03/17 Javascript
jquery ui resize 中border-box的bug修正
2015/04/26 Javascript
jQuery表单验证简单示例
2016/10/17 Javascript
在Vue组件中使用 TypeScript的方法
2018/02/28 Javascript
javascript性能优化之分时函数的介绍
2018/03/28 Javascript
vue解决弹出蒙层滑动穿透问题的方法
2018/09/22 Javascript
基于iview的router常用控制方式
2019/05/30 Javascript
Vue组件间数据传递的方式(3种)
2020/07/13 Javascript
easy_install python包安装管理工具介绍
2013/02/10 Python
Python实现的简单文件传输服务器和客户端
2015/04/08 Python
python如何去除字符串中不想要的字符
2020/07/05 Python
pandas数据预处理之dataframe的groupby操作方法
2018/04/13 Python
解决使用Pandas 读取超过65536行的Excel文件问题
2020/11/10 Python
python3.9实现pyinstaller打包python文件成exe
2020/12/13 Python
梅西百货澳大利亚:Macy’s Australia
2017/07/26 全球购物
BIBLOO波兰:捷克的一家在线服装店
2018/03/09 全球购物
La Senza官网:北美顶尖性感内衣品牌
2018/08/03 全球购物
美国购买韩国护肤和美容产品网站:Althea Korea
2020/11/16 全球购物
金士达面试非笔试
2012/03/14 面试题
端午节活动策划方案
2014/03/09 职场文书
小学生学习感言
2014/03/10 职场文书
2014幼儿园教师师德师风演讲稿
2014/09/10 职场文书
县政府班子个人对照检查材料
2014/10/05 职场文书
2014流动人口计划生育工作总结
2014/12/20 职场文书
创先争优个人总结
2015/03/04 职场文书
协议书格式模板
2016/03/24 职场文书
交互式可视化js库gojs使用介绍及技巧
2022/02/18 Javascript
JS开发前端团队展示控制器来为成员引流
2022/08/14 Javascript