PromiseとsetTimeoutを一番簡単に理解します.

13717 ワード

Promise
MDN上の例はやや変化している:
var p = new Promise(function(resolve, reject){
	setTimeout(function(){
		resolve("foo");
		console.log("first");
	}, 1000);
});

p.then(function(value){
	console.log(value);
});
Promiseを定義するときは伝達の関数の内部でresove/rejectを呼び出しますが、本当に実行するときはPromise.then()を呼び出します.(Promiseを定義するとき、newのfunctionを同期実行し、resoveに実行したときの状態がpendingからfulfilledに変化し、コールバック関数をマイクロタスクキューに置いて、現在のマクロタスクを実行した後、マイクロタスクキューに実行します.実行するのはthenに転送された関数です.rejectであればcatchの着信関数を実行します.分かりません.⚠️マクロタスクはJavaScriptエンジンが宿主環境の割り当てを待つマクロタスクである.JSエンジンが自ら起こしたのはマイクロタスクです.
レスレスレスの違いと複数回のthen:
var p = new Promise(function(resolve, relect){
	resolve();
});
p.then(function(){console.log("a");}).then(function(){console.log("b");});
比較
var p = new Promise(function(resolve, relect){
});
p.then(function(){console.log("a");}).then(function(){console.log("b");});
2、Promiseのようなキュー内のマイクロタスクの実行は、マクロタスク(setTimeout)より先に行われ、マイクロタスクは今回のループの最後で実行され、マクロタスクは次のループで実行される.以下の例を参照してください.
function sleep(duration) {
    return new Promise(function(resolve, reject) {
        console.log("b");
        setTimeout(resolve,duration);
    })
}
console.log("a");
var s = sleep(2000);
setTimeout(function(){console.log("wait")},2000);
s.then(()=>console.log("c"));
同じ秒数、cはいつもwaitの前で印刷します.異なる秒数の場合は、先に印刷します.
検査理解効果:https://www.cnblogs.com/mengfangui/p/8670698.html(文の中に二つの問題があります.やってもいいです.)
⚠️async/awaitを勉強している時に問題があります.awaitなどはresoliveが実行し終わったのですか?(setTimeoutなどであれば、待ちません.setTimeoutからresoliveが入ってきたら、resoveが実行されるのを待っています.)
var oDiv = document.getElementsByTagName("div")[0];
function sleep(color, duration){
	return new Promise(function(resolve, reject){
		console.log(color);
		setTimeout(resolve,duration);
	}).then(function(){
		oDiv.className = color;
	})
}
async function lightOff(){
	while(true){
		await sleep("yellow", 3000);
		await sleep("red", 1000);
		await sleep("green", 2000);
	}
}
lightOff();
思考:最初は書き間違えました.returnを書いていませんでした.revove関数は直接setTimeoutに書いています.信号の変化は一秒の色が変わっています.そして順番が違っています.待っていないように見えますが、なぜこの結果がまだ考えられますか?