zoukankan      html  css  js  c++  java
  • 获取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

  • 相关阅读:
    tableview 与 tableview cell
    swift基础知识
    HttpRequest
    ios界面跳转
    C# TextBox常用方法总结
    C#中string.format用法详解
    数据库填充DataSet,逐行访问
    C#连接SQL SERVER数据库的详细步骤!
    高德地图API INVALID_USER_SCODE问题以及keystore问题
    基础地图Android SDK
  • 原文地址:https://www.cnblogs.com/zmc/p/6916164.html
Copyright © 2011-2022 走看看