拿到JavaScript异步函数的返回值六种方法总结
发布时间:2016-12-17, 15:36:53 分类:HTML | 编辑 off 网址 | 辅助
正文 2143字数 121,722阅读
1.错误尝试当年未入行时,我的最初尝试:
<script>
function getSomething() {
var r = 0;
setTimeout(function() {
r = 2;
}, 10);
return r;
}
function compute() {
var x = getSomething();
alert(x * 2);
}
compute();
</script>
Run code
Cut to clipboard
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>
Run code
Cut to clipboard
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>
Run code
Cut to clipboard
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>
Run code
Cut to clipboard
同步的写法,能实现异步的逻辑,感觉高大上了很多。
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>
Run code
Cut to clipboard
6.async(需最新chrome版本支持)
心想这算是够屌的吧,后来又听说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>
Run code
Cut to clipboard
参考资料:
《你不知道的javascript中卷》
《ECMAScript 6 入门》阮一峰
(支付宝)给作者钱财以资鼓励 (微信)→
暂无评论 »