コールバック関数2、Promise、Async
6036 ワード
に網を張る
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
の代わりにreturn
でresolve
の価格を得る.その後、
promise
を歌うときはawait
、主にpromise
を歌うときに使います.resolve
に設定された値を結果値としてreturn
を得ることができ、閉鎖形態である.このとき、
await
はasync
とともに使用される.ここで提案した疑問は,それほど面倒な方法ではなく,
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を使用して値を返すのが便利です.
Reference
この問題について(コールバック関数2、Promise、Async), 我々は、より多くの情報をここで見つけました https://velog.io/@kyle-shk/콜백함수2-Promise-Asyncテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol