印刷順序による血相
4642 ワード
印刷順序による血相
非同期プログラミングはJSの中で重要なモジュールです.先日B駅をぶらつきました.このような質問を利用して、研究してみます.
まず変数オブジェクトを作成します.関数と変数を宣言します.関数の宣言優先度は変数より高いです.になります
promise 1にとって:
promise 2にとってsetTimeoutマクロタスクを開始し、その後のthenはマクロタスクが終了した後のセカンドマイクロタスクで実行されます.
promise 3にとって:
main関数に入ります.実行
async...await実行手順
async...awaitはgeneratorの文法飴です.本質はgenerator+coライブラリで、関数実行器を内蔵しています.各yeildは自動的に実行されます.最後に実行した結果をPromise resoliveの方式で投げ出します.チェーンコールが便利です.私たちはコードをbabelで翻訳して、下のコードの中の注釈の1、2つのところを見ることができます.
この後の出力順序は以下の通りです.
レゲナートモジュールの参考資料について、興味のあるものは以下の資料を知ることができます.
1、
https://www.iteye.com/blog/schifred-2369320
2、
https://juejin.cn/post/6844903701908291592
非同期プログラミングはJSの中で重要なモジュールです.先日B駅をぶらつきました.このような質問を利用して、研究してみます.
let promise1 = Promise.resolve()
.then(res => console.log(1))
.then(res => console.log(2))
let promise2 = new Promise(resolve => {
setTimeout(() => {
console.log(6)
resolve()
})
}).then(res => console.log(3))
async function main() {
console.log(4)
console.log(await Promise.all([promise2, promise1]))
console.log(5)
return { obj: 5 }
}
let promise3 = Promise.resolve()
.then(res => console.log(8))
.then(res => console.log(9))
console.log(typeof main())
変数オブジェクト宣言まず変数オブジェクトを作成します.関数と変数を宣言します.関数の宣言優先度は変数より高いです.になります
VO = {
main: reference async function(){},
promise1: undefined,
promise2: undefined,
promise3: undefined,
}
次にコードの実行段階では、まず変数に値を割り当てます.promise 1にとって:
Promise.resolve()
すぐに実行されます. 本輪に入るミニタスクがあります.promise 2にとってsetTimeoutマクロタスクを開始し、その後のthenはマクロタスクが終了した後のセカンドマイクロタスクで実行されます.
promise 3にとって:
then(res => console.log(1)).then...
は即座にPromise.resolve()
を実行して本輪に入れるマイクロタスクを実行します.main関数に入ります.実行
then(res => console.log(8)).then...
実行console.log(4)
このステップは関数全体の一番重要なところです.async...await実行手順
async...awaitはgeneratorの文法飴です.本質はgenerator+coライブラリで、関数実行器を内蔵しています.各yeildは自動的に実行されます.最後に実行した結果をPromise resoliveの方式で投げ出します.チェーンコールが便利です.私たちはコードをbabelで翻訳して、下のコードの中の注釈の1、2つのところを見ることができます.
"use strict";
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error); return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator(fn) {
return function () {
var self = this,
args = arguments;
// 2. async promise
// Promise executor
return new Promise(function (resolve, reject) {
var gen = fn.apply(self, args);
function _next(value) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); }
_next(undefined);
});
};
}
var promise1 = Promise.resolve().then(function (res) {
return console.log(1);
}).then(function (res) {
return console.log(2);
});
var promise2 = new Promise(function (resolve) {
setTimeout(function () {
console.log(6);
resolve();
});
}).then(function (res) {
return console.log(3);
});
function main() {
return _main.apply(this, arguments);
}
function _main() {
// 1. main _asyncToGenerator
_main = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
// 3. regeneratorRuntime facebook regenerator , generator
// mark next、throw、return
// wrap , next context
// regenerator
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
console.log(4);
_context.t0 = console;
_context.next = 4;
return Promise.all([promise2, promise1]);
case 4:
_context.t1 = _context.sent;
_context.t0.log.call(_context.t0, _context.t1);
console.log(5);
return _context.abrupt("return", {
obj: 5
});
case 8:
case "end":
return _context.stop();
}
}
}, _callee);
}));
return _main.apply(this, arguments);
}
var promise3 = Promise.resolve().then(function (res) {
return console.log(8);
}).then(function (res) {
return console.log(9);
});
console.log(typeof(main()));
console.log(await Promise.all([promise2, promise1]))
の実行が完了するのを待って、この行は迷いがあります.promise 1とpromise 2の実行前にトリガされました.ここでは彼らの非同期が全部実行されるのを待つだけです.その後の実行は同期操作です.この後の出力順序は以下の通りです.
4
'object' //async
1
8
2
9
6
3
[undefined, undefined]
5
レゲナートレゲナートモジュールの参考資料について、興味のあるものは以下の資料を知ることができます.
1、
https://www.iteye.com/blog/schifred-2369320
2、
https://juejin.cn/post/6844903701908291592