この記事では、主に JavaScript の非同期呼び出しの問題について、小さな質問を通して段階的に説明します。興味のある方は、この記事を参照してください。呼び出します。
問題
以下の aa() 関数を変更できます。その目的は、console.log() を使用して、コピー後に必要な値を出力することです
function aa() { setTimeout(function() { return "want-value"; }, 1000); }
ただし、追加の要件があります:
aa() 関数 自由に変更できますが、console.log() は使用できません
setTimeout パッケージを console.log() ステートメントの実行に含めることはできません
回答
おそらくこれは面接の質問でも何でも。質問の主な目的は、非同期呼び出しの実行結果の処理を調べることです。非同期呼び出しなので、結果を同期的に待つことはできません。非同期操作をシミュレートします。当初、ハンドラーの処理結果の非同期通知(呼び出し)はコールバックで行われていました
function aa(callback) { setTimeout(function() { if (typeof callback === "function") { callback("want-value"); } }, 1000); } aa(function(v) { console.log(v); });
function aa() { return new Promise(resolve => { setTimeout(function() { resolve("want-value"); }, 1000); }); } aa().then(v => console.log(v));
function aa() { return new Promise(resolve => { setTimeout(function() { resolve("want-value"); }, 1000); }); } async function main() { const v = await aa(); console.log(v); } main();
ここで、await は非同期メソッドでのみ使用できることに注意してください。そのため、await を使用するには、非同期メイン メソッドを定義し、グローバル スコープで呼び出す必要があります。 main メソッドは非同期 (async として宣言されている) であるため、main() 呼び出しの後に他のステートメント (console.log("hello") など) がある場合、このステートメントが最初に実行されます。
async/await 構文を使用すると、同期コードを記述するときと同じように非同期呼び出しを記述することができ、論理的なジャンプを避けてより簡単に記述することができます。 (参考: 地獄から天国へ、Node コールバックが async/await に変更)
もちろん、main() を定義してから main() を呼び出すことは IIFE でカプセル化できます
(async () => { const v = await aa(); console.log(v); })();
以上がJavaScript 非同期呼び出し例の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。