JavaScript中如何异步函数的返回值

今天研究一个小问题: 怎么拿到JavaScript异步函数的返回值?

1.错误尝试

当年未入行时,我的最初尝试:

<script>

functiongetSomething() {

 varr = 0;

 setTimeout(function() {

 r = 2;

 }, 10);

 returnr;

}

 

functioncompute() {

 varx = getSomething();

 alert(x * 2);

}

compute();

</script>

2.回调函数

弹出的不是4,而是0,后来知道这是异步的问题,

要用回调技术来做:

<script>

functiongetSomething(cb) {

 varr = 0;

 setTimeout(function() {

 r = 2;

 cb(r);

 }, 10);

}

 

functioncompute(x) {

 alert(x * 2);

}

getSomething(compute);

</script>

3.promise

回调函数真是个好东西,然后一直这么写代码写了很久。遇到异步就传函数!!后来我知道有promise这一个东西,专门解决由于回调函数引起的问题,又学会了promise:

<script>

functiongetSomething() {

 varr = 0;

 returnnewPromise(function(resolve) {

 setTimeout(function() {

  r = 2;

  resolve(r);

 }, 10);

 });

}

 

functioncompute(x) {

 alert(x * 2);

}

getSomething().then(compute);

</script>

promise仍然没有放弃回调,只是回调的位置发生了改变。

4.generator

再后来我又学会了generator,知道其有中断函数执行的能力,又做了新的尝试:

<script>

functiongetSomething() {

 varr = 0;

 setTimeout(function() {

 r = 2;

 it.next(r);

 }, 10);

}

 

function*compute(it) {

 varx = yield getSomething();

 alert(x * 2);

}

varit = compute();

it.next();

</script>

同步的写法,能实现异步的逻辑,感觉高大上了很多。

5.promise + generator

后来又听说promise加generator,才是异步的完美方式,赶紧用高射炮打蚊子(这个例子,还不足以说出二者在一起用的好处):

<script>

functiongetSomething() {

 varr = 0;

 returnnewPromise(function(resolve) {

 setTimeout(function() {

  r = 2;

  resolve(r);

 }, 10);

 });

}

 

function*compute() {

 varx = yield getSomething();

 alert(x * 2);

}

varit = compute();

it.next().value.then(function(value) {

 it.next(value);

});

</script>

6.async

心想这算是够?诺陌桑?罄从痔??s7给出了终极方案:async。

作为爱学习的少年,心想自己不能被落下:

<script>

functiongetSomething() {

 varr = 0;

 returnnewPromise(function(resolve) {

 setTimeout(function() {

  r = 2;

  resolve(r);

 }, 10);

 });

}

 

asyncfunctioncompute() {

 varx = await getSomething();

 alert(x * 2);

}

compute();

</script>

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

后记:

上面所有的例子,在最新chrome上都可以运行。一个个小例子,点了点几个名词。

当然也只是“点”而已,如果能提供读者深入学习相关知识点的一个trigger,那么老姚就心满意足了。

以上就是老姚童鞋给我们分享的全部内容了,希望对大家理解JavaScript异步函数能够有所帮助

原文链接:http://www.qdfuns.com/notes/17398/8a2084587fbd3f6c170c1bb8a79045c6.html

时间: 2024-11-10 01:10:14

JavaScript中如何异步函数的返回值的相关文章

获取JavaScript异步函数的返回值_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.回调函数

Javascript中怎么得到模式窗体返回的值

问题描述 Javascript中怎么得到模式窗体返回的值 解决方案 解决方案二:2.可以通过window.returnValue向打开对话框的窗口返回信息,当然也可以是对象.例如:------------------------------parent.htm<script>str=window.showModalDialog("modal.htm",,"dialogWidth=200px;dialogHeight=100px");alert(str);

类中const函数的返回值问题

问题描述 类中const函数的返回值问题 我写了一个matrix类,其中定义了一个二维指针int **p用来表示这个矩阵,现在我需要些一个下标操作符的重载,但是他会报错. const int *&matrix::operator const { return p[n]; } 这个函数返回一个一维指针引用.但是我不知道错在哪儿了. 但是如果把返回引用改成返回一维指针本身,也就是如下所示,就没问题了.为什么呢??哪个大神来解释下. const int *matrix::operator const

VBS中InputBox函数的返回值使用技巧_vbs

如果用户单击确定或按下 ENTER,则 InputBox 函数返回文本框中的内容.如果用户单击取消,则函数返回一个零长度字符串 (""). 这是参考手册对InputBox函数返回值的说明,简单而明了,还有必要专门写一篇文章来讨论?我知道你一定对标题不屑一顾,换成是我,我也一定会不屑一顾,如果我没有看到百度VBS吧里的一个帖子. 关于Inputbox 疑惑 ---------------------------- 如果用户单击确定或按下 ENTER,则 InputBox 函数返回文本框中

Javascript中的异步以及如何异步

Javascript语言的执行环境是"单线程"(single thread) js是单线程的,执行起来是顺序的.所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推 优点:实现起来比较简单,执行环境相对单纯 缺点:只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行.常见的浏览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地

Ajax异步提交数据返回值的换行问题实例分析_AJAX相关

本文实例分析了Ajax异步提交数据返回值的换行问题.分享给大家供大家参考,具体如下: 前面分析介绍了<Javascript基于AJAX回调函数传递参数>及<IE浏览器与FF浏览器关于Ajax传递参数值为中文时的区别>,学习了ajax回调函数传参与针对不同浏览器处理中文乱码问题的方法.这里就来分析一下ajax异步提交返回值中换行问题的处理技巧. 背景介绍: 需要实现的功能是:在下拉框中选择分类,提交到PHP根据选择的分类返回该分类下的成员名称,返回值各成员姓名以换行的形式显示到tex

Ajax异步提交数据返回值的换行问题实例分析

本文实例分析了Ajax异步提交数据返回值的换行问题.分享给大家供大家参考,具体如下: 前面分析介绍了<Javascript基于AJAX回调函数传递参数>及<IE浏览器与FF浏览器关于Ajax传递参数值为中文时的区别>,学习了ajax回调函数传参与针对不同浏览器处理中文乱码问题的方法.这里就来分析一下ajax异步提交返回值中换行问题的处理技巧. 背景介绍: 需要实现的功能是:在下拉框中选择分类,提交到PHP根据选择的分类返回该分类下的成员名称,返回值各成员姓名以换行的形式显示到tex

深入认识javascript中的eval函数_javascript技巧

1)介绍javascript中的eval函数的用法 (2)如何在函数内执行全局代码 ►先来说eval的用法,内容比较简单,熟悉的可以跳过. eval函数接收一个参数s,如果s不是字符串,则直接返回s.否则执行s语句.如果s语句执行结果是一个值,则返回此值,否则返回undefined. 需要特别注意的是对象声明语法"{}"并不能返回一个值,需要用括号括起来才会返回值,简单示例如下: 复制代码 代码如下: var code1='"a" + 2'; //表达式 var c

JavaScript中的Function函数_javascript技巧

首先给大家介绍JavaScript中function定义函数的几种方法: 1.最基本的作为一个本本分分的函数声明使用. 复制代码 代码如下: function func(){} 或 复制代码 代码如下: var func=function(){}; 2.作为一个类构造器使用: function class(){} class.prototype={}; var item=new class(); 3.作为闭包使用: (function(){ //独立作用域 })(); 4.可以作为选择器使用: