2016-03-23 9 views
1

私は、私の脳が非同期/完全にはっきりしていないことを知っています。私はいくつかの行に使用され、非同期とマークされた関数内の他のものではなく、多くの例を参照しています。関数内ですべてを実行するには、各行を待つ必要がありますか?

myFunction() async { 
    await functionA(); 
    await print("This really long thing that's going to print out."); 
    await functionB(); 
    await MyExtraClass.lookupSomethingQuickly(); 
    ... 
} 

、私はそれは通常、このようなものだ参照だから、例:

たとえば、私が今まで(私は基本的な/シンプルなものの一例として、print文を使用しています)このような例を見てきましたまれている場合
myFunction() async { 
    await functionA(); 
    print("This really long thing that's going to print out."); 
    await functionB(); 
    MyExtraClass.lookupSomethingQuickly(); 
    ... 
} 

簡単なことが理論的に順番に場合や、完了することをちょうど仮定があります場合、私は疑問に思ってだから、各行の前でのawaitを置くことは、私は絶対に行を追跡するためにライン1を必要とする場合にやるべきものです2を3行目などに従ってください... functionB()が消える前にそのプリントが絶対に必要な場合はどうしたらいいですか?

私は、async/awaitで関数を書くたびに、すべての行を判断する必要があります。良いタイミングと運のためにコードが動作しているかどうか、あるいは実行をオフにします。

答えて

5

async/awaitは、非同期コードを書きやすく、読みやすく、推論しやすくすることです。 Synchronuosのコードには、このようなサポートは必要ありません。
あなたは、このコード例を取る場合

import 'dart:async' show Future; 
void main() { 
    doSomethingAsync().then((_) => print('afterwards')); 
    print('at last'); 
} 

Future doSomethingAsync() { 
    return new Future.delayed(const Duration(seconds: 1),() { 
    print('done something'); 
    }); 
} 

https://www.dartlang.org/docs/tutorials/futures/

参照ダートでの非同期プログラミングのために何かをして、最後の

を印刷したDartPad

でそれを試してみてください
その後

あなたは非同期実行に慣れていない場合、これは意外かもしれません

Future.delayed()に渡されたコードは、1秒の遅延で実行されるためです。 Future.delayed()のコードが実行されたときにFutureインスタンスがdoSomethingAsync()によって返されると「完了」します。

この行に

doSomethingAsync().then((_) => print('afterwards')); 

我々はdoSomethingAsync()によって返さFuture.then(...)を呼び出し、.then(...)にクロージャ(インライン関数)を渡します。 ((_) => print('afterwards'))。

Futureの機能は、完了後にthen(...)に渡されたコードを呼び出していることです(私たちの場合、遅れて1秒後にdone somethingが印刷された場合)。

だから実行が

のようなもの
  • コールわずか1秒の遅延の後にat last
  • を印刷しFuture
  • コールprint('at last');を返す後に実行するためにprint('done something)にスケジュール通話をしてdoSomethingAsync()print('done something')と呼ばれている行きます
  • doSomethingAsync()から返されたFutureが完了しました
  • Futureは `(_)=> print( 'afterwards')を呼び出します。
  • main()が終了します。我々はasync/awaitを使用する場合

    import 'dart:async' show Future; 
    Future main() async { 
        await doSomethingAsync(); 
        print('afterwards'); 
        print('at last'); 
    } 
    
    Future doSomethingAsync() { 
        return new Future.delayed(const Duration(seconds: 1),() { 
        print('done something'); 
        }); 
    } 
    

    を実行すると、出力は何かその後

    を行って

    あるDartPad

    でそれを試してみてくださいのようなコードに見える

やっと

今すぐ実行が

  • コールdoSomething()のように見え、
  • を完了するために戻っFuture待つ我々はまた、doSomethingAsync()async/awaitを使用することができますが、今、我々は唯一のmain()

    に注力print('done something')が実行され、Futureが完了した

  • await後のコードの実行が
  • print('afterwards');
  • print('at last');

これはおそらく、あなたが期待される動作です続けています。

元の質問です。 awaitは、Futureが返され、Futureが完了したときにのみ次のコードを実行する場合にのみ必要です。呼び出しがFutureを返さない場合は、何も待機しません。

await print('xxx')はまだ有効なコードです。これはときどき非同期作業を行い、Futureを返す関数をサポートすることですが、コードを即座に実行して実行し、その後に戻るだけの非同期作業がないことがあります。この場合、待つことは何もありません。どちらの場合も

someTimesAsync() { 
    if(new DateTime.now().weekday == 1) { 
    return new Future.delayed(const Duration(seconds: 1),() { 
     print('done something'); 
    }); 
    } else { 
    print('done something'); 
    } 
} 
await someTimesAsync(); 

作品。そうでなければ、これは面倒なことになります。 async/awaitの詳細については

は、私は本当にあなたの返事に感謝いつものようにhttps://www.dartlang.org/articles/await-async/

+0

も参照してください。これは私が少し良く理解するのを助け、おそらくこれまで私が読んだ最良の説明です。私はあなたが「電話が未来を返さなければ、待つことは何もない」と言ったときにフォローアップしたかったのです。 他の機能の中で私自身の機能を使用するとき、私はこれに問題があると思います。私の機能の1つが完了するまでに時間がかかる(すなわち、1000人のテニス選手をランク付けする)とき、私は将来を返すべきでしょうか?私がFutureを返さない場合、この関数を使用するコードは自動的に待ちますか? – Dan

+0

これが質問かどうか分かりません。私はこのように説明します。あなたが仕事をしてくれるように指示し、仕事が終わったときにあなたに連絡し、彼があなたに戻ってくるまで待っているときは、これが「待っている」ものです。あなたが誰かに言うなら、私にこの物に手を差し伸べれば、彼はすぐにあなたに手を差し伸べるでしょう。そして、あなたは何かをやる機会がないので、待っていません。アクションが「ワンステップ」で完了したため、あなたは「待つ」必要はありません。 –

+0

それは助けと私は理解に近いと感じています。私は私が「すぐに」あるものについていると思う。それでは、このシナリオはどうでしょうか?100万の乱数を合計する関数があるとしましょう。これは合計+ = rのような単純な実行であり、合計を返します。そして、私は戻り値r1 + r2 + r3のような3つの乱数の合計を返す別の関数を持っています。どちらの場合も、処理する前に合計が必要です。私の頭脳では、「最初の機能を待つ必要があるのは時間がかかるかもしれないから、待たなければならない。私の考え方が間違っていることを教えてくれませんか? – Dan

関連する問題