Flutter中Dart語言的async/await

Dart中的async/await與C#等其他語言中的用法相似,這也讓那些有過這些語言使用經驗的人很容易上手。
然而,即使你沒有過任何使用async/await異步編程的經驗的話,你也會發現Dart中的async/await也是非常容易上手的。
只要記住這里的async/await和其他異步編程語言有最基本的一致性就行了。
首先,你要先理解兩個關鍵字,就是async和await,你想要運行的任何一個異步函數都要在函數簽名上增加async這個關鍵字。
這個關鍵字是在函數的右邊,緊跟函數名:
    void hello() async {
        print('something exciting is going to happen here...');
    }

當然,你想要異步運行的函數可能會有很多其他的操作(比如文件I/O,或者網絡操作),別急,我會在接下來說:
第一,我們先來說await,這個關鍵字的意思就是說:繼續然后異步執行這個函數,函數執行完畢后,繼續執行下一行代碼。
下面的部分代碼就是async/await用法的最好的解釋,你也可以參考著這么寫:

    void main() async {
        await hello();
        print('all done');
    }
上面的這段代碼有兩點需要著重注意:
    1.我們在main函數上注明了async關鍵字,因為,我們要異步執行hello方法
    2.我們把await關鍵字直接放到了我們要異步執行的方法的前面,所以,這也是我們最常用的async/await組合方式。
你只需要記住,只要你想用await,那么就要確認所有調用的方法以及任何這個方法里面調用的方法都要用async注明
那么async/await是怎么工作的呢?
    1.當你await任何異步函數的時候,調用者的代碼的執行就會掛起,這個時候,async方法正在被執行。當async 操作執行完畢后,
    await的執行結果會包含在一個Future對象中返回。
    2.看下下面這個簡單的例子,我們把four()這個函數的返回值是賦值給了變量X,然后,我們打印看看是不是我們想要的結果
        import 'dart:async';
        void main() async {
            var x = await four();
            print(x);
        }

        Future<int> four() async {
            return 4;
        }
### 一個更實際的例子

     其實,你想要異步執行過代碼的原因就是你知道你要執行一段運行時間比較長的函數,然而你不希望在函數執行期間程序對用戶的操作沒有任何反應。我們創建了一個耗時2s的函數,然后異步執行。
        import 'dart:async';

        class Employee {
        int id;
        String firstName;
        String lastName;
        
        Employee(this.id, this.firstName, this.lastName);
        }

        void main() async {
            print("getting employee...");
            var x = await getEmployee(33);
            print("Got back ${x.firstName} ${x.lastName} with id# ${x.id}");
        }

        Future<Employee> getEmployee(int id) async {
            //Simluate what a real service call delay may look like by delaying 2 seconds   
            await Future<Employee>.delayed(const Duration(seconds: 2));
            //and then return an employee - lets pretend we grabbed this out of a database ??
            var e = new Employee(id, "Joe", "Coder");
            return e;
        }
    如果你運行上面的代碼,你就會馬上看到“getting employee”打印出來,然后2s之后,employee返回然后打印出詳細信息。

### 多個異步調用

    在有些編程語言中,如果他們不支持async/await語法而不得不做多個異步調用是一個很頭疼的事情,這是因為,你要先做第一個異步調用然后在第二個,第三個。。。,這也就是所謂的回調地獄。
    然而,有了async/await,你就可以線性的調用而不用潛逃,就像寫非異步代碼那樣。
    看看你下面的代碼,我們有三個異步的方法,然后我們想同時,按順序異步調用他們。
        import 'dart:async';

        Future<String> firstAsync() async {
            await Future<String>.delayed(const Duration(seconds: 2));
            return "First!";
        }

        Future<String> secondAsync() async {
            await Future<String>.delayed(const Duration(seconds: 2));
            return "Second!";
        }

        Future<String> thirdAsync() async {
            await Future<String>.delayed(const Duration(seconds: 2));
            return "Third!";
        }

        void main() async {
        var f = await firstAsync();
        print(f);
        var s = await secondAsync();
        print(s);
        var t = await thirdAsync();
        print(t);
        print('done');
        }
   打印結果:
    First!

    Second!

    Third!

    done

參考:https://www.educative.io/edpresso/darts-async-await-in-flutter

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,743評論 2 370

推薦閱讀更多精彩內容