非同期関数の構文がES7に追加されました。非同期関数はPromiseオブジェクトに基づいてカプセル化され、非同期プログラミングを解決します。非同期コードを同期形式で記述できるため、コードにコールバック関数がネストされなくなり、コードがネストされなくなります。明確になります。
1.同期APIとは何ですか?非同期APIとは何ですか
- 同期API:現在のAPIが実行された後でのみ、次のAPIを実行できます
console.log('before');
console.log('after');
- 非同期API:現在のAPIの実行は、後続のコードの実行をブロックしません
console.log('before');
setTimeout(
() => {
console.log('last');
}, 2000);
console.log('after');
2.同期APIと非同期APIの違い(戻り値を取得)
- 同期APIは戻り値からAPI実行の結果を取得できますが、非同期APIはできません
function sum (n1, n2) {
return n1 + n2;
}
const result = sum (10, 20);
function getMsg () {
setTimeout(function () {
return {
msg: 'Hello Node.js' }
}, 2000);
}
const msg = getMsg ();
- 非同期APIの実行結果を取得するには、コールバック関数を使用する必要があります
function getMsg (callback) {
setTimeout(function () {
callback ({
msg: 'Hello Node.js' })
}, 2000);
}
getMsg (function (msg) {
console.log(msg);
});
3.同期APIと非同期APIの違い(コード実行順序)
- 同期APIは上から下に順番に実行され、前のコードは次のコードの実行をブロックします
for (var i = 0; i < 100000; i++) {
console.log(i);
}
console.log('for循环后面的代码');
- 非同期APIは、コードを実行する前にAPI実行の完了を待機しません
console.log('代码开始执行');
setTimeout(() => {
console.log('2秒后执行的代码')}, 2000);
setTimeout(() => {
console.log('"0秒"后执行的代码')}, 0);
console.log('代码结束执行');
- コード実行順序の分析
4.Node.jsの非同期API
- Node.jsのほとんどは非同期APIです。たとえば、要件で複数のファイルを順番に読み取る必要がある場合、ファイルを順番に読み取る必要がある場合、非同期APIの背後にあるコードの実行は、前の非同期APIの実行結果に依存します。引き続きコールバック関数メソッドを使用する場合それを解決するために、コールバック地獄の問題があります。
const fs = require('fs');
fs.readFile('./1.txt', 'utf8', (err, result1) => {
console.log(result1)
fs.readFile('./2.txt', 'utf8', (err, result2) => {
console.log(result2)
fs.readFile('./3.txt', 'utf8', (err, result3) => {
console.log(result3)
})
})
});
- コールバック地獄の問題を解決するためにES6で約束が与えられます
5.約束
- Promiseの目的は、Node.js非同期プログラミングのコールバック地獄の問題を解決することです。
- ファイルを順番に読み取る必要性を引き続き確認します
const fs = require('fs');
function p1 () {
return new Promise ((resolve, reject) => {
fs.readFile('./1.txt', 'utf8', (err, result) => {
resolve(result)
})
});
}
function p2 () {
return new Promise ((resolve, reject) => {
fs.readFile('./2.txt', 'utf8', (err, result) => {
resolve(result)
})
});
}
function p3 () {
return new Promise ((resolve, reject) => {
fs.readFile('./3.txt', 'utf8', (err, result) => {
resolve(result)
})
});
}
p1().then((r1)=> {
console.log(r1);
return p2();
})
.then((r2)=> {
console.log(r2);
return p3();
})
.then((r3) => {
console.log(r3)
})
- 上記のコードはコールバック地獄の問題を解決しますが、上記のコードから非常に面倒であることがわかるため、非同期関数構文がES7に追加されています。
5.非同期機能
- 非同期関数は、Promiseオブジェクトに基づいてカプセル化され、非同期プログラミングを解決します。非同期コードを同期形式で記述できるため、コードにネストされたコールバック関数がなくなり、コードが明確になります。
const fn = async () => {
};
async function fn () {
}
非同期キーワード
- 通常の関数を定義する前にasyncキーワードを追加すると、通常の関数は非同期関数になります
- 非同期関数はデフォルトでpromiseオブジェクトを返します
- 非同期関数内でreturnキーワードを使用して結果を返します。結果はpromiseオブジェクトにラップされます。returnキーワードはresolveメソッドを置き換えます。
- 非同期関数内でthrowキーワードを使用して、プログラム例外をスローします
- 非同期関数を呼び出してから、チェーン内のthenメソッドを呼び出して、非同期関数の実行結果を取得します。
- 非同期関数を呼び出してから、catchメソッドをチェーンして、非同期関数の実行のエラー情報を取得します。
キーワードを待つ
- awaitキーワードは、非同期関数にのみ表示できます
- await promise awaitは、promiseオブジェクトと他のタイプのAPIのみを書き込むことができます。
- awaitキーワードは、promiseが戻るまで非同期関数の実行を一時停止します。
- p1、p2、p3ファイルを順番に読み取る場合も同じようにします
const fs = require('fs');
const promisify = require('util').promisify;
const readFile = promisify(fs.readFile);
async function run () {
let r1 = await readFile('./1.txt', 'utf8')
let r2 = await readFile('./2.txt', 'utf8')
let r3 = await readFile('./3.txt', 'utf8')
console.log(r1)
console.log(r2)
console.log(r3)
}
run();