jsコードの非同期実行方式
3425 ワード
JavaScriptの実行環境はシングルスレッドであるため、jsコードの2つの実行方式をもたらす: jsコードの先着順で実行されるシーケンス型 イベント駆動トリガで実行されるイベント型 jsコードの先着順で実行するシーケンス型
つまり同期実行とは、位置が前のコードに対して実行された場合に、後続のコードを実行します.購読 リリース 以上、私たちがカスタマイズしたイベント
以上より
jsで非同期的に実行される方法:イベント傍受、イベントのリリース・購読、
その他の非同期実行方式
また、非同期的な実行方式es 6の新しいap Generator関数と対応するシンタックス糖
つまり同期実行とは、位置が前のコードに対して実行された場合に、後続のコードを実行します.
console.log('1');
console.log('2');
イベントドライバで実行するイベントタイプfunction c(){
console.log('3');
}
console.log('1');
onclick = c();
console.log('2');
非同期実行:jsメインスレッドをブロックしない限り、実行されるコードは非同期で実行され、以上のクリックイベントトリガ関数c()の実行は後続コードの実行に影響しません.したがって、すべてのイベントトリガ関数は非同期的に実行されます.すなわち、第1の非同期的な実行方式です.イベント傍受onclick = c();
から非同期的に実行される第二の方法を検討します.リリース・購読モード:まずonclick
はjs元のイベントです.それでは私達がカスタマイズしたイベントに換えると、いわゆるリリース購読モードを構成します.カスタムイベントはカスタムイベントを参照してください.Event.on('click',fn)
Event.emit('click')
click
のトリガfn
の実行は、メインスレッドの実行順序に影響しないので、fn
関数コードは非同期で実行される.イベントの公開購読モードから、第3の非同期の実行方法を検討します.const event = {};
function on(type,callback){
event.type = callback;
}
function emit(type){
event.type();
}
以上は最も簡単なイベントのリリース購読です.つまりcallback
の実行です.以下は簡単な非同期です. function A(callback){
console.log("I am A");
callback();
console.log("I am C")
}
function B(){
setTimeout(function(){
console.log("I am B");
},1000)
}
A(B);
第4の非同期実行方式promise
を、コールバック関数から検討する. class Promisser{
constructor(callback) {
this.res = this.res.bind(this);
this.rej = this.rej.bind(this);
this.state = {};
callback(this.res,this.rej)
}
res(val){
this.state.success = val
}
rej(err){
this.state.error = err
}
then(resCallback,rejCallback){
Object.defineProperty(this.state,'success',{
get: function () {
return this.state
},
set: function (newValue) {
resCallback(newValue);
}
})
Object.defineProperty(this.state,'error',{
get: function () {
return this.state
},
set: function (newValue) {
rejCallback(newValue);
}
})
}
}
const test = new Promisser(function(res,rej){
setTimeout(()=>{
res('success')
},1000)
setTimeout(()=>{
rej('error')
},2000)
})
test.then((res)=>{
console.log('111111',res) //111111 success
},(rej)=>{
console.log('222222',rej) //222222 error
})
以上は簡単なpromiss
原生シミュレーションの実施であり、あくまでも対応する状態の変化を待ち受けるトリガ対応callback
の実行であり、実行された位置だけが関数の外部に移動していることがわかる.以上より
jsで非同期的に実行される方法:イベント傍受、イベントのリリース・購読、
promise
の非同期実行原理はすべてコールバック関数であり、js非同期実行の主な方法でもある.その他の非同期実行方式
また、非同期的な実行方式es 6の新しいap Generator関数と対応するシンタックス糖
async
関数はここでは議論されません.