//「async function式」or「async function宣言」で
//「AsyncFunction」オブジェクトを返すasync関数を定義
let f = async function(x) {
return x;
};
console.log(f);
// -> [AsyncFunction: f]
console.log(async function f(x) {
return x;
});
// -> [AsyncFunction: f]
AsyncFunctionオブジェクトについて
// AsyncFunctionはグローバルオブジェクトではないのでこんな感じで取得して使える
const AsyncFunction = Object.getPrototypeOf(async function() {}).constructor;
let f = new AsyncFunction("x", "return x;");
console.log(f);
// -> [AsyncFunction: anonymous]
async関数(AsyncFunctionオブジェクト)が呼び出された場合はPromiseを返す
let f = async function(x) {
return x;
};
console.log(f());
// -> Promise { undefined }
async 関数が呼び出された場合、 Promise を返します。
... 🤦
つまり
// Promiseなのでreturn, errorでthen, catchに繋げられる
let f = async function(x) {
if (x === "🙋") {
return x;
} else {
throw new Error("🚨");
}
};
f("🙋")
.then(v => console.log(v))
.catch(e => e);
// -> 🙋
f("🙆")
.then(v => v)
.catch(e => console.log(e.message));
// -> 🚨
「...ずっと無駄なPromiseでラップしてましたわ」
JavaScript の async/await の仕様をずっと誤解していた
async function
async function expression
AsyncFunction