DARTにおける将来:非同期,待ち,そして使用するとき


DARTで非同期論理を実装するために、複数の方法があります.DARTには次の3つのキーワードがあります.async , await , and then .
このブログでは、どのように、私たちのニーズに応じて使用するときに学びます.

概要

  • What is asynchronous programming?
  • Asynchronous in dart
  • Using then
  • Using async-await

  • Code Samples
  • Sample 1
  • Sample 2
  • Conclusion
  • Final Note
  • 非同期プログラミングとは何か

    Asynchronous programming refers to a block of code that runs in parallel with other blocks of code. As a result, we can do several things at the same time.


    ソースGIPHY
    たとえば、レシピの一覧を取得するAPI要求があるとします.このネットワークコールは少し時間がかかるかもしれません.このフェッチ中に、ユーザーが入力できるテキストフィールドがあります.
    我々のアプリケーションは、ユーザーとの対話だけでなく、同時にレシピをフェッチしている.
    これについて考えるもう一つの方法は、メインタスクフローを中断することなく、いくつかのバックグラウンドタスクを別々に行うことです.

    ダーツの非同期

    Dart gives us two ways to implement asynchronous logic:

  • Stream
  • Future
  • このブログではFuture .Future クラスには様々なコンストラクタがあります.特定のキーワードを使用するときに実装する必要があります.キーワードは次のとおりです.async , await , and then .

    使用

    then works on the concept of callbacks. The callback is exactly what it says it is. Calling back (executing) a block of code sometime later.

    Let's say we are fetching a list of recipes. This returns a Future .

    • After the Future is completed (we've fetched the recipes), we want to display a message to the user.
    • During this fetching, we don't want to stick there but continue to execute our next block of code.

    Let's look at the following code. For simplicity, we'll use print statements.

    You can run the code sample below in dartpad. Just copy-paste the code in dartpad and run it.


    < div >
    <出力> < br/>
    <> P >
    クラスをハイライト表示する
    start fetching recipes
    a random computation
    recipes fetched
    after fetching recipes
    
    < div >
    コードを理解しましょうp >
    4行目では、私たちのレシピを取り出します.p >

    Here, we've used the Future.delayed constructor for demo purposes. Using this, we can specify the time we want to wait for (here we are waiting for 1 second).
    Refer here, if you want to know more about this function.


    行6 - 8では、私たちは、レシピがフェッチされるときに実行されると思われるコールバック(コードのブロック)を与えていますFuture )br/> < br/>
    行8以降のコードは、レシピを取得するのを待ちませんが、実行を続けます.p >
    出力を解析する
    < OL >
  • 最初のconsole print文はstart fetching recipes 予想通り.
  • 番目のコンソールprint文はa random computation . これが望ましい結果です.The Future 完了するまでに時間がかかり、残りのコード(8行目以降)は完了するのを待ちませんが、実行します.
  • しばらくしてrecipes fetched and after fetching recipes は、Future .
  • < OL >
    < hr/>
    <高橋>then 完全にここにフィットしますp >
    もう一つのユースケースを見ましょう.p >
    <ウル>
  • アフターFuture が完了(我々は、レシピをフェッチした)、我々はユーザーにメッセージを表示したい.
  • レシピをフェッチして8行以下で実行しないでください.
  • < ull >
    最も簡単な方法は、すべてのコードをthen ブロックp >
    < div class ="LagagCount - gig - Link - tag "
    "スクリプトのID "https://gist.github.com/nicks101/d9c307faf50a3ee8ed4b981dccd6ef58.js//>
    < div >
    <出力> < br/>
    <> P >
    クラスをハイライト表示する
    start fetching recipes
    recipes fetched
    after fetching recipes
    a random computation
    
    < div >
    我々は、ちょうど下にすべてを加えましたthen ブロック.さて、a random computation を実行した後に実行されます.p >
    このユースケースを実装するより良い方法がありますbr/> < br/>
    レシピをフェッチして、以下のコードを実行しないようにしたいので、より簡単な構文を使うことができますbr/> < br/>
    そしてそれはasync and await そうです.非同期論理を実装する別の構文p >

    を使う

    Let's implement our second use case again.

    Output:

    start fetching recipes
    recipes fetched
    after fetching recipes
    a random computation
    

    This time, we've not used any callbacks explicitly like the then block. Instead, we've added async in line 1 and await in line 4.

    • async keyword tells dart that this function might use asynchronous logic. So void main has the async keyword.
    • await keyword tells dart that the following statement will return a Future . The Future should be completed and then the code below will be executed.

    Let's look at some more examples.

    Code Samples

    As seen above, we can have multiple implementations for the same logic. Let's look at some code samples and try to simplify them.

    Sample 1

    void main() async {
      await Future.delayed(Duration(seconds: 1), () {
        print('inside delayed');
      }).then((_) {
        print('inside then');
      });
    
      print('after delayed');
    }
    

    The then block is redundant here. Since we're awaiting the Future , the then callback can be implemented like a normal code of block.

    Simplified:

    void main() async {
      await Future.delayed(Duration(seconds: 1), () {
        print('inside delayed');
      });
    
      print('inside then');
    
      print('after delayed');
    }
    

    Sample 2

    void main() {
      Future.delayed(Duration(seconds: 1), () {
        print('inside delayed 1');
      }).then((_) {
        print('inside then 1');
    
        Future.delayed(Duration(seconds: 1), () {
          print('inside delayed 2');
        }).then((_) {
          print('inside then 2');
        });
      });
    
      print('after delayed');
    }
    

    There is a nesting of then blocks here. We can use async , await syntax inside a then block also.

    Simplified:

    void main() {
      Future.delayed(Duration(seconds: 1), () {
        print('inside delayed 1');
      }).then((_) async {
        print('inside then 1');
    
        await Future.delayed(Duration(seconds: 1), () {
          print('inside delayed 2');
        });
    
        print('inside then 2');
      });
    
      print('after delayed');
    }
    

    I hope the examples helped in understanding the various syntaxes.

    And that's it for asynchronous programming in dart using Future .

    Conclusion

    • We can use then syntax or async-await syntax or both to implement asynchronous logic.
    • Any syntax can be used to achieve our desired result. But we should also focus on code-readability.

    For further reading, you can refer to dart official docs.

    Final Note


    この記事を読んでくれてありがとう.あなたが楽しんだなら、他の人と共有することを考えてくださいbr/> < br/>
    何か間違いがあれば教えてくださいbr/> < br/>
    下記の意見を共有してください.p >