diff --git a/README.md b/README.md index c32c34d..0491271 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,18 @@ # assignment_async_nodejs Async Node.js sprint +Jared Gebel +9/8/2017 + +Promises, File Operations, and Event Emitters +Promises +index.js + +File Operations +fspTest.js +./data/lorem.txt +./data/test.txt +./lib/fsp.js + +Reverse Engineering Node.js Event Emitter +./lib/emitter-mode.js +emitter.js diff --git a/data/lorem.txt b/data/lorem.txt new file mode 100644 index 0000000..84d3365 --- /dev/null +++ b/data/lorem.txt @@ -0,0 +1 @@ +Lorem ipso, this is text. diff --git a/data/test.txt b/data/test.txt new file mode 100644 index 0000000..62fef12 --- /dev/null +++ b/data/test.txt @@ -0,0 +1 @@ +Hello!again! \ No newline at end of file diff --git a/emitterTest.js b/emitterTest.js new file mode 100644 index 0000000..28e6926 --- /dev/null +++ b/emitterTest.js @@ -0,0 +1,27 @@ +var Emitter = require("./lib/emitter"); +var emitter = Emitter; + +var print = function(str) { + console.log(str); +}; + +emitter.on("click", function() { + console.log("click has fired"); +}); + +emitter.on("pop", function() { + console.log("pop has fired"); +}); + +emitter.emit("click"); +emitter.emit("pop"); + +emitter.removeListener("click"); + +emitter.emit("click"); +emitter.emit("pop"); + +emitter.on("click", function() { + console.log("click has fired"); +}); +emitter.emit("click"); diff --git a/fspTest.js b/fspTest.js new file mode 100644 index 0000000..9165593 --- /dev/null +++ b/fspTest.js @@ -0,0 +1,34 @@ +var fs = require("fs"); +var fsp = require("./lib/fsp"); + +fsp + .readFile("./data/lorem.txt") + .then(function(data) { + // Outputs the file data + console.log(data); + }) + .catch(function(err) { + console.error(err); + }); + +fsp + .writeFile("./data/test.txt", "Hello!") + .then(function(res) { + // Outputs the file data + // after writing + console.log(res); + }) + .catch(function(err) { + console.error(err); + }); + +fsp + .appendFile("./data/test.txt", "Hello again!") + .then(function(res) { + // Outputs the file data + // after appending + console.log(res); + }) + .catch(function(err) { + console.error(err); + }); diff --git a/index.js b/index.js new file mode 100644 index 0000000..ff6e768 --- /dev/null +++ b/index.js @@ -0,0 +1,86 @@ +// 1. Create a promise that resolves the message "Hello Promise!" after 1 second +var p = Promise.resolve("Hello Promise!"); +p.then(function(message) { + setTimeout(function() { + console.log(message); + }, 1000); +}); + +// 2. Create a function delay that returns a promise that resolves the value milliseconds after delaying for the specified number of milliseconds +var delay = function(milliseconds) { + return new Promise(function(resolve, reject) { + setTimeout(function() { + resolve(milliseconds); + }, milliseconds); + }); +}; + +var countDown = function(t) { + console.log(t); + return delay((t -= 100)); +}; + +delay(1000) + .then(countDown) //=> 1000 + .then(countDown) //=> 900 + .then(countDown) //=> 800 + .then(countDown) //=> 700 + .then(countDown) //=> 600 + .then(countDown) //=> 500 + .then(countDown) //=> 400 + .then(countDown) //=> 300 + .then(countDown) //=> 200 + .then(countDown) //=> 100 + .then(countDown); //=> Done! + +// 3. Create a function that accepts a number and returns a promise that resolves that number squared + +var squared = function(number) { + if (number !== "NaN") { + return number * number; + } else { + // can't get it to throw error beyond NaN + throw "Your input is not a number."; + } +}; + +var array = [1, 2, 3, 4, 5, 6, 7, 8, 9]; +array = array.map(function(i) { + return Promise.resolve(squared(i)); +}); + +Promise.all(array).then( + function(results) { + console.log(results); + }, + function(err) { + console.log(err); + } +); + +// 4. Create a function with signature doBadThing(forRealz) +var doBadThing = function(bool) { + if (bool === false) { + return Promise.resolve("Yay!"); + } else { + return Promise.reject("No"); + } +}; + +var forRealz = true; +doBadThing(forRealz) + .then(function(results) { + console.log(results); + }) + .catch(function(err) { + console.log(err); + }); + +var forRealz = false; +doBadThing(forRealz) + .then(function(results) { + console.log(results); + }) + .catch(function(err) { + console.log(err); + }); diff --git a/lib/emitter.js b/lib/emitter.js new file mode 100644 index 0000000..db3fbf4 --- /dev/null +++ b/lib/emitter.js @@ -0,0 +1,31 @@ +var emitter = { + events: {}, + + on: function(eventType, callback) { + // If event type does not exist, create a new [eventType] array in events object + if (!this.events[eventType]) { + this.events[eventType] = []; + } + + this.events[eventType].push(callback); + }, + emit: function(eventType) { + var event = this.events[eventType]; + if (event) { + event.forEach(function(callback) { + callback.call(); + }); + } + }, + + removeListener: function(eventType) { + var event = this.events[eventType]; + event.shift(); + }, + + removeAllListeners: function() { + this.events = {}; + } +}; + +module.exports = emitter; diff --git a/lib/fsp.js b/lib/fsp.js new file mode 100644 index 0000000..f4a8021 --- /dev/null +++ b/lib/fsp.js @@ -0,0 +1,34 @@ +var fs = require("fs"); + +var _data; + +var fsp = { + readFile: function(path) { + return new Promise(function(resolve, reject) { + fs.readFile(path, "utf8", function(err, data) { + _data = data; + err ? reject(err) : resolve(data); + }); + }); + }, + + writeFile: function(path, data) { + return new Promise(function(resolve, reject) { + fs.writeFile(path, data, function(err, data) { + _data = data; + err ? reject(err) : resolve(data); + }); + }); + }, + + appendFile: function(path, data) { + return new Promise(function(resolve, reject) { + fs.appendFile(path, data, function(err, data) { + _data = data; + err ? reject(err) : resolve(data); + }); + }); + } +}; + +module.exports = fsp; diff --git a/package.json b/package.json new file mode 100644 index 0000000..ff3c809 --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "assignment_async_nodejs", + "version": "1.0.0", + "description": "Async Node.js sprint\r Jared Gebel\r 9/8/2017", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "https", + "url": "https://github.com/jaredjgebel/assignment_async_nodejs" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/jaredjgebel/assignment_async_nodejs" + }, + "homepage": "https://github.com/jaredjgebel/assignment_async_nodejs#readme", + "dependencies": { + "events": "^1.1.1", + "fs": "0.0.1-security" + } +}