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

x9696h22 8年前
   <p>今天研究一个小问题: <strong>怎么拿到JavaScript异步函数的返回值?</strong></p>    <p><strong>1.错误尝试</strong></p>    <p>当年未入行时,我的最初尝试:</p>    <pre>  <code class="language-javascript"><script>  function getSomething() {   var r = 0;   setTimeout(function() {    r = 2;   }, 10);   return r;  }    function compute() {   var x = getSomething();   alert(x * 2);  }  compute();  </script></code></pre>    <p><strong>2.回调函数</strong></p>    <p>弹出的不是4,而是0,后来知道这是异步的问题,</p>    <p>要用回调技术来做:</p>    <pre>  <code class="language-javascript"><script>  function getSomething(cb) {   var r = 0;   setTimeout(function() {    r = 2;    cb(r);   }, 10);  }    function compute(x) {   alert(x * 2);  }  getSomething(compute);  </script></code></pre>    <p><strong>3.promise</strong></p>    <p>回调函数真是个好东西,然后一直这么写代码写了很久。遇到异步就传函数!!后来我知道有promise这一个东西,专门解决由于回调函数引起的问题,又学会了promise:</p>    <pre>  <code class="language-javascript"><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></code></pre>    <p>promise仍然没有放弃回调,只是回调的位置发生了改变。</p>    <p><strong>4.generator</strong></p>    <p>再后来我又学会了generator,知道其有中断函数执行的能力,又做了新的尝试:</p>    <pre>  <code class="language-javascript"><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></code></pre>    <p>同步的写法,能实现异步的逻辑,感觉高大上了很多。</p>    <p><strong>5.promise + generator</strong></p>    <p>后来又听说promise加generator,才是异步的完美方式,赶紧用高射炮打蚊子(这个例子,还不足以说出二者在一起用的好处):</p>    <pre>  <code class="language-javascript"><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></code></pre>    <p><strong>6.async</strong></p>    <p>心想这算是够屌的吧,后来又听说es7给出了终极方案:async。</p>    <p>作为爱学习的少年,心想自己不能被落下:</p>    <pre>  <code class="language-javascript"><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></code></pre>    <p>到这里终于长出了一口气。</p>    <p><strong>后记:</strong></p>    <p>上面所有的例子,在最新chrome上都可以运行。一个个小例子,点了点几个名词。</p>    <p>当然也只是“点”而已,如果能提供读者深入学习相关知识点的一个trigger,那么老姚就心满意足了。</p>    <p><strong>参考资料:</strong></p>    <ul>     <li>《你不知道的javascript中卷》</li>     <li>《ECMAScript 6 入门》阮一峰</li>    </ul>    <p>来自<strong><em>: <a href="/misc/goto?guid=4959730058313836286" rel="nofollow,noindex"> 解决怎么拿到JavaScript异步函数的返回值?</a></em></strong></p>