From e16da198eb6682ec93b9fe19328b172422e06597 Mon Sep 17 00:00:00 2001 From: Jared Gebel Date: Tue, 12 Sep 2017 19:33:44 -0400 Subject: [PATCH 1/7] Complete problems 3 and 4 --- index.js | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 index.js diff --git a/index.js b/index.js new file mode 100644 index 0000000..18f32a4 --- /dev/null +++ b/index.js @@ -0,0 +1,89 @@ +// 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 milliseconds; +var delay = function(milliseconds) { + var pq = Promise.resolve(milliseconds); + pq.then(function(milliseconds) { + setTimeout(function(milliseconds) { + console.log(milliseconds); + }); + }); +}; + +var countDown = function(milliseconds) { + milliseconds -= 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)); +}); + +// Call the function here, I missed that and was struggling with what was going on +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); + }); From 2b5a61325aa66aa37f4767a044b548ea2a88f5ea Mon Sep 17 00:00:00 2001 From: Jared Gebel Date: Tue, 12 Sep 2017 21:52:55 -0400 Subject: [PATCH 2/7] Work on problem 2 --- index.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/index.js b/index.js index 18f32a4..43d19c5 100644 --- a/index.js +++ b/index.js @@ -9,17 +9,15 @@ p.then(function(message) { // 2. Create a function delay that returns a promise that resolves the value milliseconds after delaying for the specified number of milliseconds /* var milliseconds; -var delay = function(milliseconds) { - var pq = Promise.resolve(milliseconds); - pq.then(function(milliseconds) { - setTimeout(function(milliseconds) { - console.log(milliseconds); - }); - }); -}; +var delay = new Promise(function(resolve) { + setTimeout(function(milliseconds) { + resolve(milliseconds); + }, milliseconds); +}); var countDown = function(milliseconds) { - milliseconds -= 100; + console.log(milliseconds); + return (milliseconds -= 100); }; delay(1000) @@ -51,7 +49,6 @@ array = array.map(function(i) { return Promise.resolve(squared(i)); }); -// Call the function here, I missed that and was struggling with what was going on Promise.all(array).then( function(results) { console.log(results); From 5d3dfec0e52a033e83701f06c1bf16edb9f725cf Mon Sep 17 00:00:00 2001 From: Jared Gebel Date: Wed, 13 Sep 2017 10:43:32 -0400 Subject: [PATCH 3/7] Set up fsp module --- data/lorem.txt | 0 fspTest.js | 34 ++++++++++++++++++++++++++++++++++ lib/fsp.js | 32 ++++++++++++++++++++++++++++++++ package.json | 22 ++++++++++++++++++++++ 4 files changed, 88 insertions(+) create mode 100644 data/lorem.txt create mode 100644 fspTest.js create mode 100644 lib/fsp.js create mode 100644 package.json diff --git a/data/lorem.txt b/data/lorem.txt new file mode 100644 index 0000000..e69de29 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/lib/fsp.js b/lib/fsp.js new file mode 100644 index 0000000..29708a4 --- /dev/null +++ b/lib/fsp.js @@ -0,0 +1,32 @@ +var fs = require("fs"); +var path = "./data/lorem.txt"; + +var _data; +var __data; +var ___data; + +var fsp = { + readFile: fs.readFile(path, "utf8", function(err, data) { + _data = data; + err ? console.error(err) : console.log(data); + }), + + writeFile: fs.writeFile(path, "We are using fs.writeFile again", function( + err, + data + ) { + __data = data; + err ? console.error(err) : console.log("Data has been written."); + }), + + appendFile: fs.appendFile( + path, + "Now let's add this to the file using appendFile", + function(err, data) { + ___data = data; + err ? console.err(err) : console.log("Data has been appended"); + } + ) +}; + +module.exports = fsp; diff --git a/package.json b/package.json new file mode 100644 index 0000000..a5162d6 --- /dev/null +++ b/package.json @@ -0,0 +1,22 @@ +{ + "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": { + "fs": "0.0.1-security" + } +} From 333c8b7ec2839629af36ad22c5c453b95d9676ca Mon Sep 17 00:00:00 2001 From: Jared Gebel Date: Wed, 13 Sep 2017 12:26:53 -0400 Subject: [PATCH 4/7] Complete problem 2 --- index.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/index.js b/index.js index 43d19c5..ff6e768 100644 --- a/index.js +++ b/index.js @@ -7,17 +7,17 @@ p.then(function(message) { }); // 2. Create a function delay that returns a promise that resolves the value milliseconds after delaying for the specified number of milliseconds -/* -var milliseconds; -var delay = new Promise(function(resolve) { - setTimeout(function(milliseconds) { - resolve(milliseconds); - }, milliseconds); -}); +var delay = function(milliseconds) { + return new Promise(function(resolve, reject) { + setTimeout(function() { + resolve(milliseconds); + }, milliseconds); + }); +}; -var countDown = function(milliseconds) { - console.log(milliseconds); - return (milliseconds -= 100); +var countDown = function(t) { + console.log(t); + return delay((t -= 100)); }; delay(1000) @@ -32,7 +32,7 @@ delay(1000) .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) { From ae94426f6e6c7b99d537da5862b94f59f23f8b7a Mon Sep 17 00:00:00 2001 From: Jared Gebel Date: Wed, 13 Sep 2017 15:18:17 -0400 Subject: [PATCH 5/7] Complete file operations exercise --- data/lorem.txt | 1 + data/test.txt | 1 + lib/fsp.js | 45 ++++++++++++++++++++++++--------------------- 3 files changed, 26 insertions(+), 21 deletions(-) create mode 100644 data/test.txt diff --git a/data/lorem.txt b/data/lorem.txt index e69de29..84d3365 100644 --- a/data/lorem.txt +++ 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..b861aad --- /dev/null +++ b/data/test.txt @@ -0,0 +1 @@ +Hello!Hello again! \ No newline at end of file diff --git a/lib/fsp.js b/lib/fsp.js index 29708a4..a7127a9 100644 --- a/lib/fsp.js +++ b/lib/fsp.js @@ -2,31 +2,34 @@ var fs = require("fs"); var path = "./data/lorem.txt"; var _data; -var __data; -var ___data; var fsp = { - readFile: fs.readFile(path, "utf8", function(err, data) { - _data = data; - err ? console.error(err) : console.log(data); - }), + readFile: function(path, data) { + return new Promise(function(resolve, reject) { + fs.readFile(path, "utf8", function(err, data) { + _data = data; + err ? reject(err) : resolve(data); + }); + }); + }, - writeFile: fs.writeFile(path, "We are using fs.writeFile again", function( - err, - data - ) { - __data = data; - err ? console.error(err) : console.log("Data has been written."); - }), + 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: fs.appendFile( - path, - "Now let's add this to the file using appendFile", - function(err, data) { - ___data = data; - err ? console.err(err) : console.log("Data has been appended"); - } - ) + 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; From 81710f70ed1b5c0dc5541c86853009cfd77995c5 Mon Sep 17 00:00:00 2001 From: Jared Gebel Date: Wed, 13 Sep 2017 17:03:55 -0400 Subject: [PATCH 6/7] Progress on event emitter --- emitterTest.js | 8 ++++++++ lib/emitter.js | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 emitterTest.js create mode 100644 lib/emitter.js diff --git a/emitterTest.js b/emitterTest.js new file mode 100644 index 0000000..8824afa --- /dev/null +++ b/emitterTest.js @@ -0,0 +1,8 @@ +var Emitter = require("./lib/emitter"); +var emitter = new Emitter(); + +var print = function(str) { + console.log(str); +}; + +emitter.on("click", print); diff --git a/lib/emitter.js b/lib/emitter.js new file mode 100644 index 0000000..9768345 --- /dev/null +++ b/lib/emitter.js @@ -0,0 +1,32 @@ +Function listener(eventType, callback) = { + this.eventType = eventType, + this.callbacks = this.callbacks.push(callback), +}; + +var emitter = { + on: function(eventType, callback) { + // If the listener object doesn't exist, create it + if(!eventType) { + eventType = new Listener(); + }; + // Push callback to array in listener object + eventType.callbacks.push(callback); + }, + emit: function(eventType) { + // If event type matches the name of a listener, run all callbacks stored in this.callbacks + if(eventType) { + for(i = 0, i <= this.callbacks.length, i++) { + var currentCallback = eventType.callbacks[i].pop(); + currentCallback(); + } + } + }, + removeListener: function(eventType, callback) { + // Remove the listener + }, + removeAllListener: function(eventType, callback) { + // Remove all listeners + } +}; + +module.exports = emitter; From ea7caf9f83facae124789b1d8ab240bbe1305f4d Mon Sep 17 00:00:00 2001 From: Jared Gebel Date: Sat, 16 Sep 2017 17:50:13 -0400 Subject: [PATCH 7/7] Complete event emitter --- README.md | 16 ++++++++++++++++ data/test.txt | 2 +- emitterTest.js | 23 +++++++++++++++++++++-- lib/emitter.js | 41 ++++++++++++++++++++--------------------- lib/fsp.js | 3 +-- package.json | 1 + 6 files changed, 60 insertions(+), 26 deletions(-) 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/test.txt b/data/test.txt index b861aad..62fef12 100644 --- a/data/test.txt +++ b/data/test.txt @@ -1 +1 @@ -Hello!Hello again! \ No newline at end of file +Hello!again! \ No newline at end of file diff --git a/emitterTest.js b/emitterTest.js index 8824afa..28e6926 100644 --- a/emitterTest.js +++ b/emitterTest.js @@ -1,8 +1,27 @@ var Emitter = require("./lib/emitter"); -var emitter = new Emitter(); +var emitter = Emitter; var print = function(str) { console.log(str); }; -emitter.on("click", print); +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/lib/emitter.js b/lib/emitter.js index 9768345..db3fbf4 100644 --- a/lib/emitter.js +++ b/lib/emitter.js @@ -1,31 +1,30 @@ -Function listener(eventType, callback) = { - this.eventType = eventType, - this.callbacks = this.callbacks.push(callback), -}; - var emitter = { + events: {}, + on: function(eventType, callback) { - // If the listener object doesn't exist, create it - if(!eventType) { - eventType = new Listener(); - }; - // Push callback to array in listener object - eventType.callbacks.push(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) { - // If event type matches the name of a listener, run all callbacks stored in this.callbacks - if(eventType) { - for(i = 0, i <= this.callbacks.length, i++) { - var currentCallback = eventType.callbacks[i].pop(); - currentCallback(); - } + var event = this.events[eventType]; + if (event) { + event.forEach(function(callback) { + callback.call(); + }); } }, - removeListener: function(eventType, callback) { - // Remove the listener + + removeListener: function(eventType) { + var event = this.events[eventType]; + event.shift(); }, - removeAllListener: function(eventType, callback) { - // Remove all listeners + + removeAllListeners: function() { + this.events = {}; } }; diff --git a/lib/fsp.js b/lib/fsp.js index a7127a9..f4a8021 100644 --- a/lib/fsp.js +++ b/lib/fsp.js @@ -1,10 +1,9 @@ var fs = require("fs"); -var path = "./data/lorem.txt"; var _data; var fsp = { - readFile: function(path, data) { + readFile: function(path) { return new Promise(function(resolve, reject) { fs.readFile(path, "utf8", function(err, data) { _data = data; diff --git a/package.json b/package.json index a5162d6..ff3c809 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ }, "homepage": "https://github.com/jaredjgebel/assignment_async_nodejs#readme", "dependencies": { + "events": "^1.1.1", "fs": "0.0.1-security" } }