PromiseとsetTimeoutを一番簡単に理解します.
Promise
MDN上の例はやや変化している:
レスレスレスの違いと複数回のthen:
検査理解効果:https://www.cnblogs.com/mengfangui/p/8670698.html(文の中に二つの問題があります.やってもいいです.)
⚠️async/awaitを勉強している時に問題があります.awaitなどはresoliveが実行し終わったのですか?(setTimeoutなどであれば、待ちません.setTimeoutからresoliveが入ってきたら、resoveが実行されるのを待っています.)
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に書いています.信号の変化は一秒の色が変わっています.そして順番が違っています.待っていないように見えますが、なぜこの結果がまだ考えられますか?