「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > JavaScript で非同期操作の結果を同期的に返すにはどうすればよいですか?

JavaScript で非同期操作の結果を同期的に返すにはどうすればよいですか?

2024 年 11 月 7 日に公開
ブラウズ:956

How can I return asynchronous operation results synchronously in JavaScript?

JavaScript の非同期操作と戻り値: 謎の解決

JavaScript では、ネットワーク リクエストやイベント処理などの非同期操作が頻繁に行われます。結果を同期的に返そうとすると課題が生じます。このような状況の 1 つは、次の jQuery 関数で例示されています。

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
}

このシナリオの目標は、GUID 値を非同期的に取得し、呼び出し元に返すことです。ただし、変数 returnValue は未定義のままであるため、同期リターンは無効になります。

非同期操作の性質を理解する

問題の核心は、 getGUID オペレーション。非同期操作は、メインスレッドをブロックすることなく実行を開始し、継続します。これは、trackPage の return ステートメントに到達するまでに getGUID 呼び出しがまだ完了しておらず、その結果が利用できないことを意味します。

コールバック関数と Promises を使用したソリューション

この課題に対処する 2 つの主なアプローチ:

  1. コールバック関数: GUID が使用可能になったときに呼び出される、trackPage へのパラメーターとしてコールバック関数を導入します。このアプローチは人気がありますが、制御フローの注意深い管理が必要であり、コールバック地獄につながる可能性があります。
  2. jQuery Deferrals: jQuery の Deferred オブジェクトを利用して、非同期操作とその最終結果を表します。 「promise」は trackPage から返すことができ、結果が利用可能になったら呼び出し元はこのプロミスにコールバックをアタッチできます。

コードのリファクタリング:

Deferred の使用オブジェクト ソリューションの場合、コードは次のようにリファクタリングできます。

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);
});

このリファクタリングされたコードは、Deferred オブジェクトを利用して非同期操作を表し、結果が利用可能になったときに結果を取得するためのコールバックを柔軟にアタッチできるようにします。

リリースステートメント この記事は次の場所に転載されています: 1729554080 権利侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3