1. 程式人生 > >獲取JavaScript非同步函式的返回值

獲取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

相關推薦

獲取JavaScript非同步函式返回

今天研究一個小問題: 怎麼拿到JavaScript非同步函式的返回值? 1.錯誤嘗試 當年未入行時,我的最初嘗試: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <script> func

js中一個函式獲取另一個函式返回問題

//此種為非同步,還不等ajax賦完值,函式就return了。   function getCaseInfoForMap(){    var formInfo=$("#firstForm").serialize();    var dd;     $.ajax({     

如何獲取js非同步請求返回

使用定時函式模擬非同步請求 回撥函式 function doSomething(callback){ setTimeout(function(){ console.log(

拿JS非同步函式返回的幾種方式

在我們的編碼過程中,為了滿足業務需求,經常需要獲取JS非同步函式的返回值。今天就來彙總一下拿值的幾種方式。 1,通過回撥函式的方式來拿返回值,這個想必大家不會陌生 function getSomething(cb) { var r = 0;

js 獲取函式返回

return 語句會終止函式的執行並返回函式的值。 但是隻會執行當前函式,如果巢狀多層函式,每一層都需要return才可以 比如: function test(){ return 1; } console.log(test()); // 1 function

C#Process.Start獲取main函式返回,以及控制檯輸出重定向到文字框

1、Process.Start()返回啟動程序main函式的返回值   private void button1_Click(object sender, EventArgs e)         {             Process da = new Process

【shell】獲取函式返回的兩種方法

方法一: 使用全域性變數 g_result="" function testFunc() { g_result='local value' } testFunc echo $g_resu

獲取$.post $.get回撥函式返回問題

專案中用Jquery操作,肯定避免不了向伺服器傳送請求,所以就會用到上面的兩個函式。完整的函式格式如下: ?$.get(URL,callback); ?$.post(URL,data,callback); 而某些時候我們要用callback回撥函式處理完以後的返回值

用谷歌的AsyncHttpClient簡單模仿安卓的AsyncHttpClient,實現非同步請求回撥函式返回

實現思路 既然要呼叫Future.get() 才能激發訪問,那麼就想到了使用一個執行緒去訪問。我們就不需要等待阻塞了。 模仿安卓的AsyncHttpClient回撥。根據狀態回撥不同的函式。 實現的效果 執行程式碼...

c#獲取url請求的返回

web c# new mar string htm http class dto /// <summary> /// 獲取url的返回值 /// </summary> /// <param name="url">eg:htt

Python小白學習之路(十)—【函式】【函式返回】【函式引數】

寫在前面: 昨天早睡之後,感覺今天已經恢復了百分之八十的樣子 又是活力滿滿的小夥郭 今日份雞湯: 我始終相信,在這個世界上,一定有另一個自己,在做著我不敢做的事,在過著我想過的生活。-------宮崎駿 函式 一、函數出現的背景 在學習函式之前,一直遵循:面向過程程式設計,即:根據業務邏輯從上到

recv函式返回總結

函式原型:int recv( SOCKET s, char *buf, int  len, int flags) 功能:不論是客戶還是伺服器應用程式都用recv函式從TCP連線的另一端接收資料。 引數一:指定接收端套接字描述符; 引數二:指明一個緩衝區,該緩衝區用來存放recv

C# socket 程式設計之 accept() 函式返回解析

accept() 函式會返回一個新的套接字,這個新的套接字在伺服器端與客戶端進行通訊。 伺服器端的繫結監聽是一個套接字,與客戶端通訊的是另一個套接字(accept函式返回的套接字,注意這裡不是返回客戶端的套接字,返回的套接字是新建立在伺服器上的,與客戶端收發訊息用的) 下面這段程式碼,是

獲取vuex store.dispatch返回的問題

 在需要dispatch的函式裡,新增return Promise.resolve(返回值) // 使用者名稱登入 LoginByUsername({ commit }, userInfo) { const username = userInfo.username.trim()

recv函式返回說明

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

opencv之type()函式返回對應表

opencv之type()函式返回值對應表 cv::Mat 類的物件有一個成員函式 type() 用來返回矩陣元素的資料型別,返回值是 int 型別,不同的返回值代表不同的型別。 int Mat::type() const 返回值與具體型別對應關係表: | |C1| C2| C3| C4| --|--|

Python建立多執行緒任務並獲取每個執行緒返回

轉自:https://www.cnblogs.com/bethansy/p/7965820.html 1.程序和執行緒     (1)程序是一個執行中的程式。每個程序都擁有自己的地址空間、記憶體、資料棧以及其他用於跟蹤執行的輔助資料。程序也可以派生新的程序來執行其他任務,

建構函式返回

建構函式返回值 For purposes other than simple initialization, classes can have constructors. Constructors are blocks of statements that can be used to in

按鍵精靈Q語言-怎麼使用自定義函式返回

按鍵精靈怎麼使用自定義函式返回值? a i MessageBox i Function a(i) i=100 End Function 就是想彈出100 aiMessageBoxiFunctiona(i)i=100EndFunction就是想讓它彈出的是100怎麼獲得自定義函式中的值呢?...展

風火程式設計--flask檢視函式返回

flask檢視函式返回json資料 原始模式 data_json = json.dumps({"errcode": "0", "errms": "成功", "data": data}) return data_json, 200, {"Contant-Type": "Applic