Dartの非同期プログラミング(部1)

画像

この一連の記事では、Dart自体のプログラミングの基本ではなく、Dartの非同期の問題について触れます。

Dartライブラリには、FutureまたはStreamオブジェクトを返す関数がいっぱいです。 これらの関数は非同期です。

ドキュメントでは次のように読みます:

未来-結果を提供するための将来の約束のように。
ストリームは、たとえば一連のイベント(ストリーム)など、一連の値を取得する方法です。

FutureとStreamはdartの一部です。非同期ライブラリは、Webアプリケーションスクリプトとコンソールから起動されたスクリプトの両方で使用できます。

次のようにライブラリをインポートします。

import 'dart:async'; 


未来


Dartライブラリには、Futureリターン関数がいっぱいです。 将来のオブジェクトが完了すると(何らかの操作)、その値は使用可能になります。 また、さまざまな方法でFutureを使用できます。

非同期と待機を使用する


これはおそらく、将来のオブジェクトを処理する最も簡単で最も理解しやすい方法です。 同期に非常に似ています。

 someFunction() async { var someVar = await functionXXL(); if (someVar == someParam) { //  -. } else { //  -. } } 

awaitとは何ですか:awaitは、非同期関数の結果を返すことを期待しています。

非同期関数(この例ではsomeFunction()-この例では)は、内部の非同期操作が実行される前に実際にすぐに戻りますが、Future、つまり 後で非同期プロセスが完了したときに特定の値を返す「約束」を返します。

asyncキーワードを持つ関数内で、1つ以上の非同期プロセスを開始できます。 言い換えると、多くのawaitコンストラクトが存在する可能性があります(元のドキュメントの例)。

 runUsingAsyncAwait() async { //... var entrypoint = await findEntrypoint(); var exitCode = await runExecutable(entrypoint, args); await flushThenExit(exitCode); } 

次のことに注意することが重要です。

1. awaitは、関数本体の内部でのみ機能します。関数本体の前にはasyncキーワードがあります。
2. await構造は、記述されているのと同じ論理順序で実行されます。 つまり 1つの待機が実行されるまで、制御は次の待機に移されません。
3.非同期関数は常にFutureを返します。 関数にFutureを返させたくない場合は、これにさまざまなソリューションを使用できます。たとえば、別の(非同期ではない)関数から非同期関数を呼び出すことができます。

次に、非同期関数でエラー処理がどのように発生するかを見てみましょう。

 someFunc() async { // -  try { await someObject.start(); } catch (e) { //   } } 

Futureメソッドを使用します-その後()


このオプションには、非同期に似た実施形態があります。 例(元のドキュメントの例)を見てみましょう。

 HttpRequest.getString(url).then((String result) { print(result); }).catchError((e) { //    . }); 

この例では、HttpRequest.getString(url)はFutureを返します。 Futureが完了すると、()はコードを実行します。この場合、コンソールに文字列を出力します。 この場合のエラー処理は、catchErrorコンストラクトで発生することに注意してください。

then()。CatchError()テンプレート自体は、try-catchの非同期バージョンです。

then()メソッドはFutureを返し、特定の順序でいくつかの非同期関数を実行する便利な方法を提供します。 thenに登録されたコールバック関数がFutureを返す場合、()は同等のFutureを返します。 コールバックが他のタイプの値を返す場合、()はこの値で終了する新しいFutureを作成します。

再び、元のドキュメントの例:

 Future result = costlyQuery(); return result.then((value) => expensiveWork()) .then((value) => lengthyComputation()) .then((value) => print('done!')) .catchError((exception) => print('DOH!')); 

ここに、いくつかの.then()の「クラッチ」があります。

この例の関数は、次の順序で機能します。

1. costlyQuery()
2.高額の仕事()
3. longyComputation()

Future.wait()メソッドを使用します


いくつかの非同期関数を実行する必要があり、それらの実行の最後にいくつかのコードを実行する場合、静的なFuture.wait()メソッドを使用できます。 例:

 Future func1 = doSmth1(); Future func2 = doSmth2(); Future func3 = doSmth3();; Future.wait([func1, func2, func3]) .then((List values) { print('!'); }); 

関連リンク


非同期プログラミングDart(eng):( リンク1リンク2 )。
また読むことができます:( リンク3リンク4

私はダートの第一人者ではないので、コメント、説明、提案に非常に感謝します。 ご清聴ありがとうございました。

Source: https://habr.com/ru/post/J256469/


All Articles