Skip to content

Instantly share code, notes, and snippets.

@owenallenaz
Last active August 22, 2018 20:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save owenallenaz/545bacc327ff1969c56d69e1afb4cfa7 to your computer and use it in GitHub Desktop.
Save owenallenaz/545bacc327ff1969c56d69e1afb4cfa7 to your computer and use it in GitHub Desktop.
Difference in error handling for async/await and callbacks
const request = require("request");
const express = require("express");
const util = require("util");
const app = express();
const requestPromise = util.promisify(request);
const timeoutPromise = util.promisify(setTimeout);
const getImgUrl = function(hostname, comicId, cb) {
request(`https://${hostname}/${comicId}/info.0.json`, function(err, resp, body) {
console.log("resp", resp);
if (err) { return cb(err); }
var temp = JSON.parse(body);
return cb(null, temp.img);
});
}
const timeoutTest = function(cb) {
setTimeout(function() {
throw new Error("dead!");
}, 10);
}
const timeoutTestPromise = async function() {
await timeoutPromise(10);
throw new Error("dead!");
}
const getImgUrlPromise = async function(hostname, comicId) {
const resp = await requestPromise(`https://${hostname}/${comicId}/info.0.json`);
return JSON.parse(resp.body).img;
}
app.get("/", function(req, res, next) {
var urls = [
"/callback_valid/",
"/callback_cb_error/",
"/callback_thrown_error/",
"/callback_timeout/",
"/promise_valid/",
"/promise_cb_error/",
"/promise_thrown_error/",
"/promise_timeout/"
];
var html = urls.map(val => `<p><a href="${val}">${val}</a></p>`).join("");
res.send(html);
});
app.get("/callback_valid/", function(req, res, next) {
getImgUrl("xkcd.com", 2036, function(err, img) {
if (err) { return next(err); }
res.send(`<img src='${img}'/>`);
});
});
app.get("/callback_cb_error/", function(req, res, next) {
getImgUrl("ashfdakshdfajsdhfkjsa.com", "bogus", function(err, img) {
if (err) { return next(err); }
res.send(`<img src='${img}'/>`);
});
});
// process crash!
app.get("/callback_thrown_error/", function(req, res, next) {
getImgUrl("xkcd.com", "bogus", function(err, img) {
if (err) { return next(err); }
res.send(`<img src='${img}'/>`);
});
});
app.get("/callback_timeout/", function(req, res, next) {
// this try/catch obviously won't work...
try {
timeoutTest();
} catch(e) {
return next(e);
}
});
app.get("/promise_valid/", async function(req, res, next) {
try {
var img = await getImgUrlPromise("xkcd.com", 2036);
} catch(e) {
return next(e);
}
res.send(`<img src='${img}'/>`);
});
app.get("/promise_cb_error/", async function(req, res, next) {
try {
var img = await getImgUrlPromise("xkcd.com", "bogus");
} catch(e) {
return next(e);
}
res.send(`<img src='${img}'/>`);
});
app.get("/promise_thrown_error/", async function(req, res, next) {
try {
var img = await getImgUrlPromise("xkcd.com", "bogus");
} catch(e) {
return next(e);
}
res.send(`<img src='${img}'/>`);
});
app.get("/promise_timeout/", async function(req, res, next) {
try {
await timeoutTestPromise();
} catch(e) {
return next(e);
}
});
app.listen(8080, function(err) {
if (err) { throw err; }
console.log("booted");
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment