JavaScript の非同期操作と戻り値: 謎の解決
JavaScript では、ネットワーク リクエストやイベント処理などの非同期操作が頻繁に行われます。結果を同期的に返そうとすると課題が生じます。このような状況の 1 つは、次の jQuery 関数で例示されています。
<code class="javascript">function trackPage() { var elqTracker = new jQuery.elq(459); elqTracker.pageTrack({ success: function() { elqTracker.getGUID(function(guid) { alert(guid); var returnValue = guid; // Attempt to assign the GUID to a variable }); } }); return returnValue; // Return the assigned variable }</code>
このシナリオの目標は、GUID 値を非同期的に取得し、呼び出し元に返すことです。ただし、変数 returnValue は未定義のままであるため、同期リターンは無効になります。
非同期操作の性質を理解する
問題の核心は、 getGUID オペレーション。非同期操作は、メインスレッドをブロックすることなく実行を開始し、継続します。これは、trackPage の return ステートメントに到達するまでに getGUID 呼び出しがまだ完了しておらず、その結果が利用できないことを意味します。
コールバック関数と Promises を使用した解決策
この課題には 2 つの主なアプローチで対処します:
コードのリファクタリング:
Deferred の使用オブジェクト ソリューションの場合、コードは次のようにリファクタリングできます。
<code class="javascript">function trackPage() { var elqTracker = new jQuery.elq(459); var dfd = $.Deferred(); elqTracker.pageTrack({ success: function() { elqTracker.getGUID(function(guid) { dfd.resolve(guid); // Resolve the Deferred object with the GUID }); } }); return dfd.promise(); // Return a promise that represents the result } // Example usage: trackPage().done(function(guid) { // Guid is now available as the parameter to the done callback alert("Got GUID: " + guid); });</code>
このリファクタリングされたコードは、Deferred オブジェクトを利用して非同期操作を表し、結果が利用可能になったときに結果を取得するためのコールバックを柔軟にアタッチできるようにします。
以上がJavaScript で非同期操作の結果を同期的に返すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。