获取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编程起步(第四课)
Feb 27 Javascript
JavaScript 浏览器验证代码(来自discuz)
Jul 17 Javascript
jquery 循环显示div的示例代码
Oct 18 Javascript
JS操作Cookie写入和读取实例代码
Oct 20 Javascript
js实现拖拽效果
Feb 12 Javascript
JavaScript的兼容性与调试技巧
Nov 22 Javascript
jQuery自定义图片上传插件实例代码
Apr 04 jQuery
bootstrap可编辑下拉框jquery.editable-select
Oct 12 jQuery
mpvue+vant app搭建微信小程序的方法步骤
Feb 11 Javascript
Angular7创建项目、组件、服务以及服务的使用
Feb 19 Javascript
JavaScript如何把两个数组对象合并过程解析
Oct 10 Javascript
Vue页面跳转传递参数及接收方式
Sep 09 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面向对象三大特点学习(充分理解抽象、封装、继承、多态)
2012/05/07 PHP
探讨fckeditor在Php中的配置详解
2013/06/08 PHP
php的sprintf函数的用法 控制浮点数格式
2014/02/14 PHP
php错误日志简单配置方法
2016/07/11 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
一些常用的JavaScript函数(json)附详细说明
2011/05/25 Javascript
jQuery中not()方法用法实例
2015/01/06 Javascript
jquery对象与DOM对象转化
2017/02/08 Javascript
jQuery插件zTree实现的多选树效果示例
2017/03/08 Javascript
微信小程序 登录的简单实现
2017/04/19 Javascript
JavaScript之面向对象_动力节点Java学院整理
2017/06/29 Javascript
JS实现websocket长轮询实时消息提示的效果
2017/10/10 Javascript
vue中使用iview自定义验证关键词输入框问题及解决方法
2018/03/26 Javascript
Vue项目全局配置微信分享思路详解
2018/05/04 Javascript
nodejs高大上的部署方式(PM2)
2018/09/11 NodeJs
详解jquery和vue对比
2019/04/16 jQuery
koa2服务端使用jwt进行鉴权及路由权限分发的流程分析
2019/07/22 Javascript
uni-app如何实现增量更新功能
2020/01/03 Javascript
React Native登录之指纹登录篇的示例代码
2020/11/03 Javascript
一起深入理解js中的事件对象
2021/02/06 Javascript
[54:25]Ti4 循环赛第三日LGD vs MOUZ
2014/07/12 DOTA
[50:12]EG vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
利用Python进行异常值分析实例代码
2017/12/07 Python
Python使用pickle模块实现序列化功能示例
2018/07/13 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
python 实现学生信息管理系统的示例
2020/11/28 Python
HTML5使用DOM进行自定义控制示例代码
2013/06/08 HTML / CSS
Html5 滚动穿透的方法
2019/05/13 HTML / CSS
日本民宿预约平台:STAY JAPAN
2017/07/01 全球购物
SCHIESSER荷兰官方网站:德国内衣专家
2020/10/09 全球购物
餐饮食品安全责任书
2015/01/29 职场文书
六一文艺汇演主持词
2015/06/30 职场文书
redis连接被拒绝的解决方案
2021/04/12 Redis
Python游戏开发实例之graphics实现AI五子棋
2021/11/01 Python
vue中控制mock在开发环境使用,在生产环境禁用方式
2022/04/06 Vue.js