diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c2658d7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/dummy.txt b/dummy.txt new file mode 100644 index 0000000..a12a553 --- /dev/null +++ b/dummy.txt @@ -0,0 +1 @@ +Spicy jalapeno bacon ipsum dolor amet spare ribs pork loin meatball, pancetta doner venison sirloin pork t-bone sausage buffalo bresaola. Spare ribs buffalo prosciutto burgdoggen picanha. \ No newline at end of file diff --git a/emitterTest.js b/emitterTest.js new file mode 100644 index 0000000..6bfe364 --- /dev/null +++ b/emitterTest.js @@ -0,0 +1,27 @@ +var Emitter = require(`./eventEmitter`); +// var Emitter = require('events'); +var emitter = new Emitter(); + +function testAlpha() { + console.log(`alpha`); +} + +function testBravo() { + console.log(`bravo`); +} + +function testCharlie() { + console.log(`charlie`); +} + +emitter.on(`event`, testAlpha); +emitter + .on("event", testBravo) + .on(`event`, testCharlie); + +emitter.emit(`event`); + +emitter.removeListener(`event`, testAlpha); +emitter.removeAllListeners(`event`); + +emitter.emit(`event`); diff --git a/eventEmitter.js b/eventEmitter.js new file mode 100644 index 0000000..3d86cbe --- /dev/null +++ b/eventEmitter.js @@ -0,0 +1,45 @@ +var emitter = function() { + var events = {}; + + this.on = function(eventName, listener) { + if (events[eventName] == undefined) { + events[eventName] = [listener]; + } else { + events[eventName].push(listener); + } + return this; + }; + + this.emit = function(eventName, ...rest) { + if (events[eventName] == undefined) { + return false; + } else if (rest.length == 0) { + for (var listeners in events[eventName]) { + events[eventName][listeners](); + } + return true; + } else { + for (var listeners in events[eventName]) { + events[eventName][listeners](rest); + } + return true; + } + }; + + this.removeListener = function(eventName, listener) { + if (events[eventName] != undefined) { + var index = events[eventName].indexOf(listener); + if (index != -1) { + events[eventName].splice(index, 1); + } + } + return this; + }; + + this.removeAllListeners = function(eventName) { + events[eventName] = undefined; + return this; + }; +}; + +module.exports = emitter; diff --git a/fileIO.js b/fileIO.js new file mode 100644 index 0000000..9ffb3bb --- /dev/null +++ b/fileIO.js @@ -0,0 +1,48 @@ +//Take the Node.js fs modules and wrap in promises. +var fs = require('fs'); + +var fsp = { + readFile: function (path) { + return new Promise (function (resolve,reject) { + fs.readFile (path, 'utf8', (err,data) => { + err ? console.log(err) : resolve(data); + }); + }); + }, + writeFile : function (path, data) { + return new Promise ( function (resolve, reject) { + fs.writeFile(path, data, function(err) { + if (err) { + reject(err); + } else { + fsp.readFile(path) + .then(function(data) { + resolve(data); + }) + .catch(function(err) { + reject(err); + }); + } + }); + }); + }, + appendFile : function (path, data) { + return new Promise ( function (resolve, reject) { + fs.appendFile(path, data, function(err) { + if (err) { + reject(err); + } else { + fsp.readFile(path) + .then(function(data) { + resolve(data); + }) + .catch(function(err) { + reject(err); + }); + } + }); + }); + } +} + +module.exports = fsp; diff --git a/fspTest.js b/fspTest.js new file mode 100644 index 0000000..6a9d8f6 --- /dev/null +++ b/fspTest.js @@ -0,0 +1,29 @@ +var fsp = require(`./fileIO`); + +var writeData = "Spicy jalapeno bacon ipsum dolor amet spare ribs pork loin meatball, pancetta doner venison sirloin pork t-bone sausage buffalo bresaola. Spare ribs buffalo prosciutto burgdoggen picanha."; + +var appendData = "Cupcake ipsum dolor sit amet I love dragée donut candy. Jelly beans sweet roll jelly-o powder sweet. Jelly liquorice biscuit pastry."; + +fsp.readFile('lorem.txt') + .then(function(data) { + console.log("read data",data); + }) + .catch(function(err) { + console.error("read err",err); + }); + +fsp.writeFile('dummy.txt', writeData) + .then(function(res) { + console.log("write data",res); + }) + .catch(function(err) { + console.error("write err",err); + }); + +fsp.appendFile('lorem.txt', appendData) + .then(function(res) { + console.log("append data",res); + }) + .catch(function(err) { + console.error("append err",err); + }); diff --git a/lorem.txt b/lorem.txt new file mode 100644 index 0000000..6cd6818 --- /dev/null +++ b/lorem.txt @@ -0,0 +1,2 @@ +Sweet sesame snaps marzipan cotton candy. Cake marshmallow toffee danish. Muffin toffee chocolate soufflé powder wafer chocolate marshmallow. Biscuit croissant gingerbread liquorice oat cake pie toffee. +Cupcake ipsum dolor sit amet I love dragée donut candy. Jelly beans sweet roll jelly-o powder sweet. Jelly liquorice biscuit pastry. \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..aaa4f75 --- /dev/null +++ b/package.json @@ -0,0 +1,22 @@ +{ + "name": "assignment_async_nodejs", + "version": "1.0.0", + "description": "asynchronous node programming practice", + "main": "warmups.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/megantaylor/assignment_async_nodejs.git" + }, + "keywords": [ + "nodejs" + ], + "author": "megan taylor", + "license": "ISC", + "bugs": { + "url": "https://github.com/megantaylor/assignment_async_nodejs/issues" + }, + "homepage": "https://github.com/megantaylor/assignment_async_nodejs#readme" +} diff --git a/warmups.js b/warmups.js new file mode 100644 index 0000000..3a89c16 --- /dev/null +++ b/warmups.js @@ -0,0 +1,99 @@ +//These few warmups will get you started working with promises. + +//1. create a promise that logs "Hello Promise!" after one second using .then +var helloPromise = new Promise(function(resolve, reject) { + setTimeout(() => { + resolve(`Hello Promise!`); + }, 1000); +}); + +helloPromise.then(function(hello) { + console.log("helloPromise", hello); +}); + +//2. Create a delay(milliseconds) function that should return a promise thatresolves the value milliseconds after delaying for the specified number of milliseconds +function delay(milliseconds) { + return new Promise((resolve, reject) => { + if (milliseconds > 0) { + resolve(milliseconds); + } else { + resolve(0); + } + }); +} + +function countDown(time) { + var output = time > 0 ? time : 'Done!'; + console.log(output); + return delay(time - 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. The promise should reject if it is not passed a number. Map an array of integers 1 to 9 to an array of promises using the function. Use Promise.all to get the result of all of the promises in the array. + +var array = [1,2,3,4,5,6,7,8,9]; + +function squared(num) { + return new Promise((resolve, reject) => { + if (isNaN(num)) { + reject(num); + } else { + resolve(num*num); + } + }); +} + +Promise.all(array.map(squared)).then( + results => { + console.log("squared", results); + }, + error => { + console.log(error); + } +); + +//4. Experiment with catch vs reject +var doBadThing = forRealz => { + return new Promise( ( resolve, reject ) => { + if( forRealz ) { + reject('Nope'); + } else { + resolve( 'Yay!'); + } + }); +}; + +doBadThing( true ) + .then( result => console.log( result )) + .catch( error => console.error( error )); + +doBadThing( false ) + .then( result => console.log( result )) + .catch( error => console.error( error )); + +doBadThing( false ) + .then( result => { + console.log( result ); + throw "ERROR!"; + }) + .catch( error => console.error( error )); + +doBadThing( true ) + .then( result => { + console.log( result ); + }, + err => console.error( err ) + );