Node.js非同期プログラミング非同期関数asyncawaitキーワード

非同期関数の構文が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');
// 改造现有异步函数api 让其返回promise对象 从而支持异步函数语法
const promisify = require('util').promisify;
// 调用promisify方法改造现有异步API 让其返回promise对象
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();

おすすめ

転載: blog.csdn.net/dairen_j/article/details/109178526