非同期和のawait
あなたは、関数の非同期を追加する場合、関数は約束を返します。
async function test() {
return "1"
}
console.log(test())
// -> Promise {<resolved>: "1"}
非同期は、次のラップされた関数Promise.resolve()の戻り値であり、プロセスは同じ値に戻り、そしてのみ支持非同期の使用を待ちます。
async function test() {
let value = await sleep()
}
非同期とは非同期約束の直接の使用に比べて最終的な解決策は、呼び出しチェーンを処理することの利点は、より明確にすることができ、正確結局、コードを書く、そして非常に病気の多くを書き込み、またできると言うことができる待ちます問題へのコールバック地獄エレガントなソリューション。
もちろん、いくつかの欠点があるため、ある非同期コードを待つが、同期コードに変換され、複数の非同期コード場合はパフォーマンスの低下の使用に依存しない待つためにつながります。
async function test() {
// 以下代码没有依赖性的话,完全可以使用 Promise.all 的方式
// 如果有依赖性的话,其实就是解决回调地狱的例子了
await fetch(url)
await fetch(url1)
await fetch(url2)
}
使用例を見て待っています:
let a = 0
let b = async () => {
a = a + await 10
console.log('2', a)
}
b()
a++
console.log('1', a)
//先输出 ‘1’, 1
//在输出 ‘2’, 10
- = 0が保存されたときにように第1の機能Bは、発電機は、物事のスタックを維持する内部発電機を実現待つため、可変又はゼロの前に10で実行を待つために、最初に実行しました
- 待つ非同期動作が、次に発現が約束を返さないので、Promise.reslove(戻り値)に包装なり、その後、同期コードは、外側の関数である実行します
- 同期コードが保存され、この時間A = 0 + 10を使用するように入れ、開始値非同期コードの完了後++で印刷を行います
内部上述の説明は、発電機を実現待つ、実際には、発電機は糖衣構文の約束、および自動実行ジェネレータの内部実装と結合されて待ちます。
コード解析の問題
function wait() {
return new Promise(resolve =>
setTimeout(resolve, 1000)
)
}
async function main() {
console.time();
const x = wait();
const y = wait();
const z = wait();
await x;
await y;
await z;
console.timeEnd();
}
main();
回答:出力時間:秒より少し。
理由:3ウェイト機能割り当てがすでに実装され始めていました。
わずかに変更されたあなたは、以上の3×1000ミリ秒の結果を得ることができるもの
function wait () {
return new Promise(
resolve => setTimeout(resolve, 1000)
)
}
async function main () {
console.time()
const x = await wait()
const y = await wait()
const z = await wait()
console.timeEnd()
}
main()