2015-11-17 42 views
1

我想我明白背後異步的想法,返回一個未來,但我不是不清楚如何異步的行爲在一個非常基本的水平。根據我的理解,它不會在程序中自動創建異步行爲。例如:如何實現異步/地等待着飛鏢

import 'dart:async'; 
main() { 
    a(); 
    b(); 
} 
a() { 
    new Timer(new Duration(milliseconds: 20),() {}); // create latency 
    print("a"); 
} 
b() { 
    print("b"); 
} 
// a 
// b 

如果你把異步後的一個(),則B()被執行第一異步和()給定的延遲後執行:

import 'dart:async'; 
main() { 
    a(); 
    b(); 
} 
a() **async** { 
    new Timer(new Duration(milliseconds: 20),() {}); // create latency 
    print("a"); 
} 
b() { 
    print("b"); 
} 
// b 
// a 

但如果你把異步在a()和b()之後,A()執行第一,類似於不使用異步可言:

import 'dart:async'; 
main() { 
a(); 
b(); 
} 
a() **async** { 
    new Timer(new Duration(milliseconds: 20),() {}); // create latency 
    print("a"); 
} 
b() **async** { 
    print("b"); 
} 
//a 
//b 

正在使用異步對所有功能完全取消異步函數?

現在,我認爲主要()異步實際上並沒有自己激活異步行爲。如果在main()之後添加async,則沒有任何更改。但是,它允許您使用等待,以防萬一在繼續執行程序之前必須先等待a()函數完成。這是正確的嗎?

import 'dart:async'; 
main() **async** { 
    **await** a(); 
    b(); 
} 
a() **async** { 
new Timer(new Duration(milliseconds: 20),() {}); // create latency 
print("a"); 
} 
b() { 
print("b"); 
} 
// waits for the value of a() if you put **await** keyword 
// a 
// b 

但是,我看到的main()異步 {}很多以及腳本的HTML標籤之後使用它,但沒有等待任何地方。這是否意味着在不同情況下的不同事物?我希望我已經充分解釋了邏輯。你能解釋我是如何誤解async/await的使用嗎?謝謝。

回答

2
a() { 
    new Timer(new Duration(milliseconds: 20),() {}); // create latency 
    print("a"); 
} 

此代碼不會延遲執行print("a"); 20 ms。它只是延緩其入隊以便以後執行,然後立即用print("a");持續的{}執行

使用async/await並沒有async/await的等效代碼看起來像你的代碼:

import 'dart:async'; 
main() async { 
    await a(); 
    b(); 

    await main2(); // call the example without async/await 
} 
Future a() async { 
    await new Future.delayed(const Duration(milliseconds: 20),() {}); // create latency 
    print("a"); 
} 
void b() { 
    print("b"); 
} 

Future main2() { 
    return a2().then((_) { 
    b(); 
    }); 
} 

// equivalent of a without async/await 
Future a2() { 
    return new Future.delayed(const Duration(milliseconds: 20),() {}) // create latency 
    .then((_) => print("a")); 
} 

嘗試在DartPad

+0

謝謝。我並不知道我並沒有真正創建延遲。但是,以您的示例爲例,唯一的區別是,如果您在a()和b()之前放置了異步,則首先獲得打印的b,然後是a。我認爲我的問題可能過於寬泛,所以讓我將其細化爲一個特例。爲什麼main()async {},當main()永遠不會真的返回任何東西時,因爲它是起始函數?當你沒有任何後續的需要等待時,它在main()下實際做了什麼? – rchkm

+0

「如果你在a()和b()之前放置了async,你首先得到打印的b,」我不明白你的意思,你能創建一個dartpad來演示嗎? '在main中等待一個()'是爲了確保'b()'在'b()'完成之前不被調用。 'await'只允許在標有'async'的函數中使用。在await main2()中'await'''沒有太大的效果,因爲它是'main'中的最後一個語句。 –

+0

我的意思可能是上面說得更好。您能否看到我寫的原始帖子和代碼,「在所有函數中完全取消異步函數使用異步?」 1)你能解釋爲什麼向a()和b()添加異步導致上述行爲的原因?我不明白。和(2)要完全清楚,我認爲你是說如果你不使用await,「main()異步」不會(實際上)添加任何東西。我還可以得出結論:腳本async type =「application/dart」src =「main.dart」,async並不真正添加任何東西。是對的嗎? – rchkm