コールバック関数2、Promise、Async


に網を張る


Node.jsプロセスは、他のJavaScriptを実行するには、JavaScript以外のタスクの完了を待つ必要があります.
通常、NodeJSのI/O nonがブロックされているため、後続のタスクは前のタスクの完了を待つことはありません.
入出力は、通常、システムディスクおよびネットワークとインタラクティブであると理解されます.
Node.jsプロセスは、他のJavaScriptを実行するには、JavaScript以外のタスクの完了を待つ必要があります.
通常、NodeJSのI/O nonがブロックされているため、後続のタスクは前のタスクの完了を待つことはありません.
入出力は、通常、システムディスクおよびネットワークとインタラクティブであると理解されます.

コールバック関数


Non blocking


最初の関数は、実行結果に基づいて実行される関数です.
上のreadFile関数のファイルを読み込んだ結果を知りたい場合は、Arow Fengを使用してコールバック関数を実装して検証します.
実際、コールバック関数の主な原因の一つは、エラー管理のためです.
コードで例を挙げてみましょう
fs.readFile('./file.md',(err,data) => {
   if(err) throw err
   console.log('non blocking data : ',data);
  })
  
  console.log('wow')
  
  //결과
  //wowo
  //non blocking data: sadsakdaslds
こんなコードがあるとしたら
このコードは他のコードとは異なり、readFileコードを読み取らなくても、まず次のコードを実行することができる.
この符号化方式を非ブロック方式と呼ぶ
1つのタスクが終了する前に、別のタスクのコードを開始できます.

blocking


ブロック方式では、通常try catch文を考慮することができる.
const fs = require('fs')

try{
  const data = fs.readFileSync('./file.md'); // 파일을 읽을떄까지 여기서 블로킹
  console.log('data : ',data)
  } catch (err) {
      console.log('err : ',err)
   }
このブロック方式では、エラーをキャプチャできないため、try catch文を使用してエラーをキャプチャします.
result :  undefined
num1+num2 4 (1초후)
上記のコードの問題
実際に呼び出されたコード(sumFunc)は、まずresultに対応し、setが実行されるため、undefinedは一時停止する
解決策
result :  undefined
num1+num2 4
getMsg :  4
実行順序は、上から下へコードによって実行され、Settimeout関数によって実行される.Settimeoutは非同期で実行され、コードがシーケンス実行時に完全に実行されなくても、コードの下部で実行できます.
したがって、settimeoutの結果値を返さないresult関数が実行され、定義されていないものが返される.
その後sumFunc(1, 3, function (getMsg) { console.log("getMsg : ", getMsg); });この部分は console.log("num1+num2", num1 + num2);という部分を実行して、4
そして callback(num1 + num2);を実行
パラメータ入力のfunction (getMsg) { console.log("getMsg : ", getMsg); }によりgetMsg : 4が実行されます.
コールバック関数の例には、次のものがあります.
function callFunction(callback) {
  console.log("callFunction called");
  let one = 1;
  let two = 2;
  let result = one + two;

  if (result > 2) {
    callback("biggner than 2");
  } else {
    callback("not biggner than 2");
  }
}

callFunction(function (getMsg) {
  //   callback;
  console.log(getMsg);
});
callFunction called
biggner than 2
error :  undefined
message :  3
これらの例があります.
したがって、これらのコールバック関数のセキュリティを保護するために、
作成されたのはpromise客体です.

Promise , Asyncs, Await


Promise


Promiseオブジェクトを使用すると、Non Blockingコードをより直感的に制御できます.
Promiseが非同期コードを制御できるのは,3つの状態を有するためである.3つのステータスは次のとおりです.
保留中(Pending):未履行または拒否の初期状態
Fulfilled(実行):演算が正常に完了しました
Rejected(失敗):演算に失敗しました
この3つの状態をどのように利用するかを理解してみましょう.タイトルに記載されているように、Promiseはオブジェクトであるため、使用時にnewを使用してインスタンス化し、宣言します.
ここにPromiseが持つ2つのコールバック関数パラメータがあります.
決心と拒絶です.
Promise.resolve(value):履行された承諾値を返します.(Fulfilledステータス)、OK(戻る)
Promise.拒否(理由):拒否された承諾を回収する.デバッグのためにエラーをチェックします.(投影済みステータス)、却下(エラー)

async,await


同期のためにPromiseと併用するのはasyncとawaitです.
その名の通り、これは非動機を待つことを意味する.使用方法は以下の通りです.
1.Promiseの結果値を受信し、使用する関数の前にasyncを入力します.
2.Promiseが返す値の前にawaitを入力します.
async:関数をブロック制御するコマンド
wait:待機する関数に追加する前に

このとき、インスタンス化されたPromiseの前にreturnを付けるのは、promise()のreturn値をpromise()の戻り値として導出するためである
ダイヤルバック。
非同期
非同期。
非同期。

上のコードを順番に説明します
まず、pormiseの代わりにreturnresolveの価格を得る.
その後、promiseを歌うときはawait、主にpromiseを歌うときに使います.resolveに設定された値を結果値としてreturnを得ることができ、閉鎖形態である.
このとき、awaitasyncとともに使用される.
ここで提案した疑問は,それほど面倒な方法ではなく,promise個のオブジェクトを直接受信し,通常の関数のように呼び出すことで疑問を生じる可能性がある.
let myFirstPromise = new Promise((resolve, reject) => {
  // We call resolve(...) when what we were doing asynchronously was successful, and reject(...) when it failed.
  // In this example, we use setTimeout(...) to simulate async code.
  // In reality, you will probably be using something like XHR or an HTML5 API.
  setTimeout(function () {
    resolve("Success!"); // Yay! Everything went well!
  }, 250);
});

console.log("myFirstPromise : ", myFirstPromise);
myFirstPromise :  Promise { <pending> } 
以上のように,戻り値を返さずに宣言したPromiseのみの結果がPromiseそのものである.
実際に使用したい承諾のresolveまたはreject値を得るにはreturnを使用して値を返すのが便利です.