トピック
let main = () => {
console.log("A");
setTimeout(() => {
//setTimeout方法的 开始
console.log("B");
new Promise((resolve) => {
//第一个promise异步 开始
console.log("C");
resolve();
}).then(() => {
// 第一个promise异步之后执行的then
console.log("D");
})
console.log("E");
}); //setTimeout方法的 结束
new Promise((resolve) => {
//第二个promise异步 开始
console.log("F");
resolve();
}).then(() => {
//第二个promise异步的then
console.log("G");
})
console.log("X");
}
main();
//请写出打印顺序
//答案:A F X G B C E D
1. 非同期プログラミングとは何ですか?
同期するコードの順序で実行します。非同期コードは順番に実行されません。
Promise は、複雑な非同期タスクをよりエレガントに記述するために ES6 によって提供されるクラスです。
Promise オブジェクトには、保留中 (進行中)、解決済み (完了)、拒否済み (失敗) の 3 つの状態があります。
Promise のパラメータは 2 つの関数です。
Promise コンストラクターは関数をパラメーターとして受け取ります。この関数は同期的であり、すぐに実行されます。, したがって、これを開始関数と呼びます。開始関数には、Promise の成功と失敗のステータスをそれぞれ示す、resolve と拒否の 2 つのパラメーターが含まれています。
質問のresolve(data);は、Promiseの非同期状態をResolved completed状態に変更することで、.thenを実行できるようになります。
solve(data) のデータは then にデータを渡すことになります。
2.setTimeout(fn,time);
setTimeout はコールバック関数のメソッドでもあります;
例: setTimeout(print, 3000); //3 秒後に print メソッドを実行します。
setTimeout と Promise の違い:
Promise のコールバック関数は垂直方向に記述されますが、setTimeout は入れ子形式で記述されるため、後のメンテナンスには役立ちません。
3. 質問を分析する
Promise はビルド後すぐに実行されます(そのため、Promise は通常、関数にラップされて返されます)。例を以下に示します。setTimeout はパラメータ時間に従ってメインスレッドに入れられます。
function print(delay, message) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
console.log(message);
resolve();
}, delay);
});
}
1) setTimeout セッションがメイン スレッドに配置されるため、メイン スレッドは次のコードの実行を開始します。.then はコールバック関数でもあり、後で実行されます。
let main = () => {
console.log("A");
//setTimeout方法的 结束
new Promise((resolve) => {
//第二个promise异步 开始
console.log("F");
resolve();
})
})
console.log("X");
}
main();
//打印:A F X
2) 前のステップで 2 番目の Promise が構築および実行されているため、今回はコールバック関数の実行が開始されます。
.then(() => {
//第二个promise异步的then
console.log("G");
})
//打印:A F X G
3) メインスレッドの後に追加された関数 setTimeout の実行を開始します
setTimeout(() => {
//setTimeout方法的 开始
console.log("B");
new Promise((resolve) => {
//第一个promise异步 开始
console.log("C");
resolve();
})
console.log("E");
});
//打印:A F X G B C E
4) Promise 同期スレッドが実行された後、最初の Promise 非同期コールバック関数を実行します。
.then(() => {
// 第一个promise异步之后执行的then
console.log("D");
})
//打印:A F X G B C E D