最近对async/await
的实现产生了兴趣,看了下babel
的转译,调用了regeneratorRuntime
的几个函数。
打开源码看了一下午,有很多东西不是很理解。
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return setTimeout(function (v) {
return console.log(v);
}, 1000);
case 2:
case "end":
return _context.stop();
}
}
以上代码我目前的理解是执行了个状态监听器,await
后的函数执行完毕后会改变_context.next
,然后结束这个状态机。
但在 console 中,执行while(true){}
页面几乎是秒卡的。
求指教!
以上运行环境为 chrome console 。
async function log (v) {
await setTimeout(v => console.log(v), 1000)
}
babel =>
"use strict";
var log = function () {
var _ref = _asyncToGenerator(regeneratorRuntime.mark(function _callee(v) {
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return setTimeout(function (v) {
return console.log(v);
}, 1000);
case 2:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
return function log(_x) {
return _ref.apply(this, arguments);
};
}();
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.