获取JavaScript异步函数的返回值

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

1.错误尝试

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

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<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,后来知道这是异步的问题,

要用回调技术来做:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

<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:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<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,知道其有中断函数执行的能力,又做了新的尝试:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<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,才是异步的完美方式,赶紧用高射炮打蚊子(这个例子,还不足以说出二者在一起用的好处):

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

<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。

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

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<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异步函数能够有所帮助

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

时间: 2024-08-03 15:26:21

获取JavaScript异步函数的返回值的相关文章

javascript 关于函数的返回值

在javascript中根据调用方式的不同返回的内容也不同 1.  以函数的形式调用 当以函数的形式调用时, 返回值和函数定义时的 ruturn 有关, return的是数字就number类型, return字符串就是string类型, return 一个函数就得到Function类型, 总之return什么就得到什么. 2. 以new操作符调用函数 function A() { this.name = "Tom"; this.age = 23; } var a = new A();

ctypes获取扩展模块中函数的返回值

ctypes获取返回值 我们前面已经看到了,通过ctypes像扩展模块中的函数传参时是没有问题的,但是我们如何拿到返回值呢?我们之前都是使用printf直接打印的,但是这样显然不行,我们肯定是要拿到返回值去做一些别的事情的.那么我们看看如何使用ctypes获取函数的返回值. 获取整型返回值 int test1(int a, int b) { int c; c = a + b; return c; } void test2() { } 我们定义了两个函数,下面编译成dll文件,dll文件名叫做mm

javascript 回调函数的返回值给全局变量赋值的问题

jQuery 中,会遇到$.get(url,data,callback,type) 或 $.post(url,data,callback,type) 返回值给全局变量赋值的问题: 例如: <script type="text/javascript" src="jquery-1.4.min.js"></script> <script language="JavaScript"> var mm = 1; $.get

shell获取函数的返回值

背景:定义了一个函数,比对本地和线上服务器集群数量差别,想要获取不同集群的个数.shell和其他语言的函数返回值还是差别挺大的. 定义一个函数 functionname(){ 操作内容 echo 输出内容 return 返回值 #返回值可有可不有 } 获得函数的返回值 1.函数默认是将标准输出传递出来,不是返回值. 所以如果直接调用functionname,实际上是将输出传递回来 例如: a=`functionname` 将函数functionname的标准输出传递给a 2.调用函数不需要加()

第二天,函数的返回值return

首先是前一天问题的答案 第一题: <!DOCTYPE html> <html lang="en"> <heda> <meta charset="UTF-8">  <title></title> </head> <body> </body> </html> 第二题: 结构-HTML 表现-CSS 行为-JavaScript 第三题 <!DOCT

Swift2.0语言教程之函数的返回值与函数类型

Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有一个返回值的函数 开发者希望在函数中返回某一数据类型的值,必须要在函数声明定义时为函数设定一个返回的数据类型,并使用return语句进行返回.其中,return语句的一般表示形式如下: return 表达式 其中,表达式可以是符合Swift标准的任意表达式.而具有返回值的函数声明定义形式如下: fu

关于 Shell中函数的返回值 问题

# !/bin/sh sum() { echo $(($1+$2)) return $(($1-$2)) } sum $1 $2 c=$(sum $1 $2) echo $? echo $c 执行命令:./bashTest 11 1 运行结果是: 12 -- sum $1 $2的结果 10 -- echo $?的结果,因为return的值为10 12 --  echo $c的结果,值为12,所以c并不会被附上return的值,echo $c时调用了sum函数,所以打印了12 我们对shell中的

Python函数之返回值、作用域和局部变量

一.函数返回值 说到返回值,相信大家肯定都认识,没错,就是return. 所谓返回值可以这样理解:函数外部的代码要想获取函数的执行结果,就可以在函数里用return语句把结果返回. 那具体怎么用呢?接着往下看: #!/usr/bin/env python3 #-*- coding:utf-8 -*- # write by congcong # return 表示一个程序的结束,他可以返回任意的元素,列表或字典 def stu_info(name,age,course): print(name,a

函数定义,返回值,传参,命名空间,闭包

函数的返回值: return是返回给函数的调用者 函数外面的代码想要获取函数的执行结果,就可以在函数里,用return语句把结果返回. 注意:在函数的执行过程中主要遇到return语句,就会停止执行并返回结果, so可以理解为return语句代表着函数的结束 如果未在函数中指定return,那这个函数的返回值为none 函数的返回值,可以返回一个函数名(可以将嵌套函数里的执行结果return给函数体外,进行执行) return永远且只能返回一个值,,如果返回多各值呢? def func1(nam