DARTにおける将来:非同期,待ち,そして使用するとき
async
, await
, and then
.このブログでは、どのように、私たちのニーズに応じて使用するときに学びます.
概要
then
async-await
Code Samples
非同期プログラミングとは何か
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:
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 >
start fetching recipes
予想通り.a random computation
. これが望ましい結果です.The Future
完了するまでに時間がかかり、残りのコード(8行目以降)は完了するのを待ちませんが、実行します.recipes fetched
and after fetching recipes
は、Future
. < hr/>
<高橋>
then
完全にここにフィットしますp >もう一つのユースケースを見ましょう.p >
<ウル>
Future
が完了(我々は、レシピをフェッチした)、我々はユーザーにメッセージを表示したい.最も簡単な方法は、すべてのコードを
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. Sovoid main
has theasync
keyword. -
await
keyword tells dart that the following statement will return aFuture
. TheFuture
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 orasync-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 >
Reference
この問題について(DARTにおける将来:非同期,待ち,そして使用するとき), 我々は、より多くの情報をここで見つけました https://dev.to/nicks101/future-in-dart-when-to-use-async-await-and-then-2bo9テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol