获取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处理table表格的代码
Dec 06 Javascript
在网站上应该用的30个jQuery插件整理
Nov 03 Javascript
input:checkbox多选框实现单选效果跟radio一样
Jun 16 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
Aug 19 Javascript
IE中document.createElement的iframe无法设置属性name的解决方法
Sep 14 Javascript
BootStrap selectpicker
Jun 20 Javascript
自定义require函数让浏览器按需加载Js文件
Nov 24 Javascript
javascript 操作cookies详解及实例
Feb 22 Javascript
Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装
Oct 21 Javascript
vue data引入本地图片的两种方式小结
Nov 13 Javascript
详解关于Vue单元测试的几个坑
Apr 26 Javascript
vue实现登录功能
Dec 31 Vue.js
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
浅谈apache和nginx的rewrite的区别
2013/02/22 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
2014/06/12 PHP
ThinkPHP3.1新特性之查询条件预处理简介
2014/06/19 PHP
PHP错误处理函数register_shutdown_function使用示例
2017/07/03 PHP
JS 时间显示效果代码
2009/08/23 Javascript
javascript的解析执行顺序在各个浏览器中的不同
2014/03/17 Javascript
js简单抽奖代码
2015/01/16 Javascript
JavaScript中文件上传API详解
2016/04/01 Javascript
js获取form表单所有数据的简单方法
2016/08/18 Javascript
JavaScript“尽快失败”的原则实例详解
2016/10/08 Javascript
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
2017/01/12 NodeJs
从零学习node.js之express入门(六)
2017/02/25 Javascript
简单实现JS上传图片预览功能
2017/04/14 Javascript
JS实现多级菜单中当前菜单不随页面跳转样式而发生变化
2017/05/30 Javascript
seajs中最常用的7个功能、配置示例
2017/10/10 Javascript
详解微信小程序input标签正则初体验
2018/08/18 Javascript
详解vscode中vue代码颜色插件
2018/10/11 Javascript
jQuery添加新内容的四个常用方法分析【append,prepend,after,before】
2019/03/19 jQuery
微信小程序分享功能onShareAppMessage(options)用法分析
2019/04/24 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
2020/04/26 Javascript
Python中字典的浅拷贝与深拷贝用法实例分析
2018/01/02 Python
Python解析并读取PDF文件内容的方法
2018/05/08 Python
Jupyter Notebook远程登录及密码设置操作
2020/04/10 Python
Pycharm学生免费专业版安装教程的方法步骤
2020/09/24 Python
Pycharm安装Qt Design快捷工具的详细教程
2020/11/18 Python
手摸手教你用canvas实现给图片添加平铺水印的实现
2019/08/20 HTML / CSS
Canvas环形饼图与手势控制的实现代码
2019/11/08 HTML / CSS
网络信息安全承诺书
2014/03/26 职场文书
公司寄语大全
2014/04/10 职场文书
中学生家长评语大全
2014/04/16 职场文书
班级旅游计划书
2014/05/03 职场文书
土木工程求职信
2014/05/29 职场文书
市场营销专业自荐书
2014/06/10 职场文书
24年收藏2000多部退役军用电台
2022/02/18 无线电
如何Python使用re模块实现okenizer
2022/04/30 Python
Go语言入门exec的基本使用
2022/05/20 Golang