当您使用 async 关键字时,您将隐式返回 Promise,无论您在函数的 return 语句中实际使用的任何类型(在这种情况下,您不会返回任何内容,所以这很简单Promise 什么都没有,或者 Promise<void> 如果你喜欢 TypeScript)。
在内部,使用async/await 的函数会展开为多个异步延续,在每次使用await 关键字时进行拆分。当你是await-ing 的承诺完成时,函数的其余部分将恢复。看看像 Babel 这样的编译器如何展开你的代码可能会很有启发性。
这段代码:
function asyncOperation() {
return new Promise((resolve) => {
setTimeout(() => {
resolve();
}, 123);
});
}
async () => {
await asyncOperation();
}
被转译为普通的 ES5:
"use strict";
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"); }); }; }
function asyncOperation() {
return new Promise(function (resolve) {
setTimeout(function () {
resolve();
}, 123);
});
}
_asyncToGenerator(regeneratorRuntime.mark(function _callee() {
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return asyncOperation();
case 2:
case "end":
return _context.stop();
}
}
}, _callee, undefined);
}));
那个丑陋的_asyncToGenerator 调用曾经是你漂亮的异步函数。它已展开为显式延续(you can try 为函数添加更多等待点和逻辑,并查看转译代码如何变化)。