JavaScript - 30
16238 ワード
非同期JavaScript
同期
同期コードとは、コードが順番に実行されることを意味します.通常、callスタックにスタックされ、メインスレッドで実行されます.
次のコードは、各ローが終了するまで実行できません.このことをBLOCKING
と言います.
非同期
非同期は同期とは異なります.非同期コードは特殊なコードにのみ適用されます.他のコードの多くは同期コードです.
例えば、setTimeout
は非同期コードとしてバックグラウンドで実行される.バックグラウンドで実行すると、他の同期コードはメインスレッドで正常に動作します.非同期コードは、同期コードBLOCKING
を含まず、non-blocking
コードと呼ばれる.非同期コードはバックグラウンドで実行できますが、同期コードは他のコードを中断せずに順次実行できます.バックグラウンドでの実行が完了したら、同期コードの実行が完了するまで待機し、コールスタックに追加してコードを完了します.img.src = 'dog.jpg';
img.addEventListener('load',function (){
img.classList.add('fadeIn');
});
以上のコードのimg.src = 'dog.jpg'
部分も非同期コードである.画像変数に画像を入れること自体がJavaScriptで非同期的に組織されています.load
イベントは、イメージのロードが完了した後に発生する必要があります.したがって、ロードイベントは、イメージのロードが完了する前に、他のload
イベントを起動することはできません.複数の非同期コードがある場合、非同期コードは他の非同期コードを待つことはありません.これは同時に実行されるコードにすぎず、どのコードがいつ終わるか分かりません.
非同期コードは、コードが終了した後に実行されるコールバック関数を引数として提供する必要があります.(ただし、addEventListenerなどのコールバック関数を受信すること自体は、非同期コードを招くことはありません.)これらのコールバック関数を使用すると、非同期コードを順番に処理できます.
地獄
LoadScript('1.js', function(){
LoadScript('2.js', function(){
LoadScript('3.js', function(){
...
}
}
上のコードはコールバック関数を用いて非同期コードを呼び出し続け,滅亡ピラミッドと呼ばれるコールバック地獄を確立した.callback地獄には以下の欠点があります.次にフィーチャーが表示されます.
img.src = 'dog.jpg';
img.addEventListener('load',function (){
img.classList.add('fadeIn');
});
LoadScript('1.js', function(){
LoadScript('2.js', function(){
LoadScript('3.js', function(){
...
}
}
LoadScript('1.js', loadScript2);
function loadScript2 () {
LoadScript('2.js', loadScript3);
}
function loadScript3 () {
LoadScript('3.js', loadScript4);
}...
上記のコードはコールバック地獄のピラミッド構造から逸脱しているが,挙動構造は同じである.しかし、ネーミングスペースもおかしくなり、これらのコードを再利用するのは難しい.AJAX
AJAXはAsynchronous JavaScriptとXMLの略です.XMLは、古いWeb通信ファイル拡張子です.最近はJSONファイルを使用していますが、以前はXMLを使用していました.しかし、AJAXという言葉は「送信要求」と呼ばれ、Webサーバと動的にデータを交換することができる.
API
APIは、許可されたソフトウェア間のデータ交換、すなわちソフトウェア自体にすぎない.APIは実際には非常に広く,Web開発に用いられるAPIも多い.
AJAXリクエスト
XMLHttpRequest
前述したように、XMLとは、Webサーバと通信するデータ型の名前である.XMLは古いデータ型で、現在は主にJSONデータ型を使用している.
実際のXMLを使用するコード
const btn = document.querySelector('.btn-country');
const countriesContainer = document.querySelector('.countries');
///////////////////////////////////////
const getCountryData = function (country) {
const xml = new XMLHttpRequest();
xml.open('Get', `https://restcountries.eu/rest/v2/name/${country}`);
xml.send();
xml.addEventListener('load', function () {
const [data] = JSON.parse(this.response);
console.log(data);
const html = `
<article class="country ${data.name}">
<img class="country__img" src="${data.flag}" />
<div class="country__data">
<h3 class="country__name">${data.name}</h3>
<h4 class="country__region">${data.region}</h4>
<p class="country__row"><span>👫</span>${(
+data.population / 1000000
).toFixed(1)} people</p>
<p class="country__row"><span>🗣️</span>${data.languages[0].name}</p>
<p class="country__row"><span>💰</span>${data.currencies[0].name}</p>
</div>
</article>
`;
countriesContainer.insertAdjacentHTML('beforeend', html);
countriesContainer.style.opacity = 1;
});
};
getCountryData('uk');
getCountryData('china');
getCountryData('usa');
XMLは、XMLHttpRequestという名前のオブジェクトの作成者によって作成されたオブジェクトによって通信することができる.xml.Open関数を使用してGet、Postを指定し、urlを使用して通信チャネルを開きます.
xml.send関数でデータを送信するとデータが送信され、受信すると
load
というイベントが発生します.xmlオブジェクトは、addEventListener関数のコールバック関数であり、addEventListener関数がデータを受信するときに行う関数です.
xmlではsendが非同期コードとして実行されます.sendはバックグラウンドで実行されるため、
data = xml.send()
というコードを記述することはできません.値はありませんが、入れません.dataはundefinedを返します.通信チャンネルを開く順番は3つの国/地域です.しかし,send後loadイベントの発生順序はそれぞれ異なる.したがって、addEventListenerを使用してコールバック関数として処理された関数を表示し、受信したデータを使用してhtmlカードを作成して表示できます.
この順序はloadイベントの発生順序を示します.
ブラウザをリフレッシュするたびに、順序が変わります.非同期コードは、どのコードが遅く終わるか分かりません.これらの問題を解決する方法は
콜백함수
である.Webサーバにアクセスするプロセス
ユーザーがWebサーバにアクセスする手順を簡単に説明します.
ユーザ(すなわちクライアント)は、DNSサーバに自分のアドレスを割り当てる.このアドレスはIPアドレスとポート番号であり、HTTPプロトコルは443ポートのままである.
TCP/IPソケットを接続してWebサーバと通信します.1つのチャネルとして、データはHTTPプロトコルを介してこのチャネル上に送信される.TCP/IPは、ビッグパケットを複数のパケットに分割して送受信することにより、ボトルネックデータを迅速に送受信し、到着先でビッグパケットに統合することで、データの安全管理を実現する.
クライアントはHTTPプロトコルを使用してWebサーバに要求を送信する.HTTPプロトコルの内容は次のとおりです.
start line:httpバージョン、ステータスコード、ステータスメッセージ
header:回答形式のheader内容
body:返信データ
これらの内容が表示されます.
httpプロトコルとhttpの重要な違いは、tlsまたはsslを使用してhttpプロトコルの暗号化を保証するかどうかです.
詳細については、OSI 7階層を参照してください.
Reference
この問題について(JavaScript - 30), 我々は、より多くの情報をここで見つけました https://velog.io/@doodream/JavaScript-30テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol