Async/Awaitの原理と簡単な実現
1572 ワード
Async/Awaitの原理と簡単な実現
解決関数コールバックはいくつかの段階を経て,Promiseオブジェクト,Generator関数からasync関数に移行した.async関数は現在、関数コールバックを解決する最良の方法である.Python、java spring、goなど、多くの言語でasyncが実現されています.
async awaitの使い方
async関数はPromiseオブジェクトを返し、関数が実行されるとawaitに遭遇すると先に戻り、トリガされた非同期操作が完了するまで待ってから、関数体内の後ろの文を実行します.
深く理解する
async関数を理解するには、async関数がGenerator関数の構文糖であるため、Generator関数を理解する必要があります.
Generatoジェネレータ
GeneratorはES 6規格で導入された新しいデータ型である.Generatorは、内部に多くの状態がカプセル化され、反復器Iteratorオブジェクトが返されるステートマシンとして理解できます.この反復器によって、関連する値と状態を巡回することができます.Generatorの顕著な特徴は,反復器の一部として毎回の戻り値が保存され,明示的に呼び出されることである.
OK、その基本的な実現を知ったら、私たちは自分で彼を実現することができます.
解決関数コールバックはいくつかの段階を経て,Promiseオブジェクト,Generator関数からasync関数に移行した.async関数は現在、関数コールバックを解決する最良の方法である.Python、java spring、goなど、多くの言語でasyncが実現されています.
async awaitの使い方
async関数はPromiseオブジェクトを返し、関数が実行されるとawaitに遭遇すると先に戻り、トリガされた非同期操作が完了するまで待ってから、関数体内の後ろの文を実行します.
function getNum(num){
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(num+1)
}, 1000)
})
}
const func = async ()=>{
const f1 = await getNum(1)
const f2 = await getNum(f1)
console.log(f2)
// 3
}
func()
深く理解する
async関数を理解するには、async関数がGenerator関数の構文糖であるため、Generator関数を理解する必要があります.
Generatoジェネレータ
GeneratorはES 6規格で導入された新しいデータ型である.Generatorは、内部に多くの状態がカプセル化され、反復器Iteratorオブジェクトが返されるステートマシンとして理解できます.この反復器によって、関連する値と状態を巡回することができます.Generatorの顕著な特徴は,反復器の一部として毎回の戻り値が保存され,明示的に呼び出されることである.
OK、その基本的な実現を知ったら、私たちは自分で彼を実現することができます.
// promise, , ++
function getNum(num){
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(num+1)
}, 1000)
})
}
// , Generator ,
function asyncFun(func){
var gen = func();
function next(data){
var result = gen.next(data);
if (result.done) return result.value;
result.value.then(function(data){
next(data);
});
}
next();
}
// Generator , promise ,
var func = function* (){
var f1 = yield getNum(1);
var f2 = yield getNum(f1);
console.log(f2) ;
};
asyncFun(func);