Во-первых, распознаватели (могут) вернуть обещание. Они не обязаны, но в обоих ваших примерах кода распознаватели возвращают обещание. Осваивайтесь с обещаниями, почти все асинхронные вещи выполняются с обещаниями в наши дни!
Далее вы должны прочитать об асинхронных функциях в JavaScript. async / await - синтаксический сахар для обещаний. Таким образом, они всегда возвращают обещание (даже если вы не используете await
внутри).
Первый пример явно возвращает Обещание. Второй пример делает то же самое, но неявно (здесь также не требуется ожидание, но это снова сделает его явным). Оба примера становятся более интересными, когда вы впоследствии изменяете значение:
signupUser: (parent, { email, name }, context) => {
return context.prisma.createUser({
email,
name,
}).then(user => {
return { ...user, isCool: user.friends > 5 };
});
}
// vs. async function
signupUser: async (parent, { email, name }, context) => {
const user = await context.prisma.createUser({
email,
name,
};
return { ...user, isCool: user.friends > 5 };
}
Синтаксический сахар означает, что за ним нет никакой новой языковой функции. Часто компиляторы сначала разбирают синтаксис перед компиляцией (особенно в функциональных языках). В качестве ментальной модели вы можете представить асинхронные функции, которые будут переписаны в форму обещания. Это поможет понять, почему они всегда возвращают обещание и что они на самом деле делают.
Понимая эту концепцию, вы поймете, что оба примера на самом деле асинхронны и что await
в вашем примере является необязательным (но только потому, что оно следует за возвратом. Если вы посмотрите на второй пример, вы также можете увидеть, почему люди утверждают, что " async выглядит более синхронно ": он избавляется от обратных вызовов.