解决怎么拿到JavaScript异步函数的返回值?

老姚
老姚 发布于 2016-12-16 13:38:44 浏览:3438 类型:原创 - 随笔 分类:JavaScript - 我也来说说系列 二维码: 作者原创 版权保护
今天研究一个小问题:怎么拿到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() {
	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

心想这算是够屌的吧,后来又听说es7给出了终极方案: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>

到这里终于长出了一口气。emoticon

后记:
上面所有的例子,在最新chrome上都可以运行。
一个个小例子,点了点几个名词。
当然也只是“点”而已,如果能提供读者深入学习相关知识点的一个trigger,那么老姚就心满意足了。

参考资料:
《你不知道的javascript中卷》
《ECMAScript 6 入门》阮一峰

本文完。
z
给个赞 44 人点赞
收藏 46 人收藏
评论 已有 24 条评论;以下用户言论只代表其个人观点,不代表 前端网(QDFuns) 的观点或立场。
登录 以后才能发表评论
最热评论
lopcomvir
lopcomvir2016-12-16 16:55:0010F
浏览器市场的版本更新永远跟不上节奏,我还是老老实实写回调吧
举报 支持 (1) 回复 (0)
最新评论
Lookforto
Lookforto2016-12-28 11:17:4324F
async那个报错
举报 支持 (0) 回复 (0)
老姚
老姚2016-12-27 10:13:3523F
一两年后再看就未必这么觉得了。 //@Ngt:哇 每篇文章都好厉害呀
举报 支持 (0) 回复 (0)
Ngt
Ngt2016-12-24 23:30:0022F
哇 每篇文章都好厉害呀
举报 支持 (0) 回复 (1)
老姚
老姚2016-12-21 07:58:1121F
恩 //@15757856549:平常最多只用到promise,promise的第二个参数Rejected带进去应该会让大家好理解很多,平常做的最深入的前端是插件所以要多考虑点其他情况
举报 支持 (0) 回复 (0)
15757856549
157578565492016-12-20 15:53:5720F
平常最多只用到promise,promise的第二个参数Rejected带进去应该会让大家好理解很多,平常做的最深入的前端是插件所以要多考虑点其他情况
举报 支持 (0) 回复 (1)
729278592
7292785922016-12-20 11:03:4019F
很实用哦emoticon
举报 支持 (0) 回复 (0)
1801341373
18013413732016-12-19 12:01:0018F
越来越看不懂emoticon
举报 支持 (0) 回复 (0)
aa22920036
aa229200362016-12-19 10:49:4617F
看见python的影子在里面
举报 支持 (0) 回复 (0)
小水晶
小水晶2016-12-19 10:32:2016F
不懂
举报 支持 (0) 回复 (0)
走火爱上鱼
走火爱上鱼2016-12-18 20:23:5815F
语法的进步就是把之前我们自己做的事情给做了  记得我当年在每一个ajax里面返回值 通过这个值来判断是否下一步   好天真哈
举报 支持 (0) 回复 (0)
duan602728596
duan6027285962016-12-17 21:08:5814F
node7.x可以用,浏览器就编译吧。。。。。。 //@hugeannex:async这梦做做就行了,等不到那时代了吧。。。
举报 支持 (0) 回复 (0)
duan602728596
duan6027285962016-12-17 21:07:2813F
async + Promise大法好
举报 支持 (0) 回复 (0)
老姚
老姚2016-12-17 13:26:4312F
慢慢等 //@hugeannex:async这梦做做就行了,等不到那时代了吧。。。
举报 支持 (0) 回复 (0)
木风622
木风6222016-12-17 09:56:4711F
对于我等小白来说,涨姿势啊
举报 支持 (0) 回复 (0)
lopcomvir
lopcomvir2016-12-16 16:55:0010F
浏览器市场的版本更新永远跟不上节奏,我还是老老实实写回调吧
举报 支持 (1) 回复 (0)
老姚 老姚 作者

与自己为敌,与自己为友,一边深挖思想,一边埋葬自己。

作者最新