Skip to content

Instantly share code, notes, and snippets.

@rmg
Created September 17, 2017 02:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rmg/c59e5967ea0b4930bbfd706c398935f8 to your computer and use it in GitHub Desktop.
Save rmg/c59e5967ea0b4930bbfd706c398935f8 to your computer and use it in GitHub Desktop.
Promises to async/await
// original Promise-only version. I try to write my functions to be pure
// when appropriate so that they are composable in to promise chains like
// this
function findOrCreateUser(id /* :string */, user /* :User */) /* :Promise<User> */ {
return db.users
.hsetnx(id, 'created_at', user.created_at.toJSON())
.then(function(isNew) {
if (isNew) {
logger.info({user: user}, 'New user');
return db.users.hmset(id, serializeUser(user))
.then(returnUser)
.then(backfillUser)
.then(newTokenForUser)
.then(findUserByToken)
.then(markAsNew);
} else {
logger.info({user: user}, 'Existing user');
return db.users.hgetall(id)
.then(deserializeUser)
.then(backfillUser);
}
});
function returnUser() {
return user;
}
function markAsNew(user /* :User */) {
user.isNew = true;
return user;
}
}
// First pass at converting the function from "just" Promises to using async and await
// Is this how async/await are supposed to be used?
async function findOrCreateUser(id /* :string */, user /* :User */) /* :Promise<User> */ {
const isNew = await db.users.hsetnx(id, 'created_at', user.created_at.toJSON());
if (isNew) {
logger.info({user: user}, 'New user');
await db.users.hmset(id, serializeUser(user));
user = await backfillUser(user);
const token = await newTokenForUser(user);
user = await findUserByToken(token);
user.isNew = true;
return user;
} else {
logger.info({user: user}, 'Existing user');
const serializedUser = await db.users.hgetall(id);
return backfillUser(deserializeUser(serializedUser));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment