diff --git a/README.md b/README.md index c32c34d..25267c6 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,4 @@ # assignment_async_nodejs Async Node.js sprint + +Test diff --git a/data/lorem.txt b/data/lorem.txt new file mode 100644 index 0000000..aa9363c --- /dev/null +++ b/data/lorem.txt @@ -0,0 +1 @@ +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 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/event_emitter.js b/event_emitter.js new file mode 100644 index 0000000..f6b888c --- /dev/null +++ b/event_emitter.js @@ -0,0 +1,41 @@ +function EventEmitter() { + this.listeners = []; +} + +EventEmitter.prototype.on = function(eventType, callback) { + this.listeners.unshift([eventType, callback]); +}; + +EventEmitter.prototype.emit = function(eventType) { + // find all listeners with the eventType + var events = this.listeners.filter(function(listener) { + return listener[0] === eventType; + }); + + //invoke each event + for (var i = events.length - 1; i >= 0; i--) { + events[i][1].call(); + } +}; + +EventEmitter.prototype.removeListener = function(eventType, callback) { + this.listeners = this.listeners.filter(function(listener) { + return !(listener[0] === eventType && listener[1] === callback); + }); +}; + +EventEmitter.prototype.removeAllListeners = function(eventType) { + this.listeners = this.listeners.filter(function(listener) { + return listener[0] !== eventType; + }); +}; + +EventEmitter.prototype.listenerCount = function(eventType) { + this.listeners = this.listeners.filter(function(listener) { + return listener[0] === eventType; + }); + + return this.listeners.length; +}; + +module.exports = EventEmitter; diff --git a/fsp.js b/fsp.js new file mode 100644 index 0000000..62520f8 --- /dev/null +++ b/fsp.js @@ -0,0 +1,41 @@ +var fs = require('fs'); + +var fsp = { + readFile: function(file) { + return new Promise(function(resolve, reject) { + fs.readFile(file, 'utf8', function(err, data) { + if (err) { + reject('No Such File'); + } else { + resolve(data); + } + }); + }); + }, + + writeFile: function(file, text) { + return new Promise(function(resolve, reject) { + fs.writeFile(file, text, 'utf8', function(err) { + if (err) { + reject('There was an error'); + } else { + resolve(text); + } + }); + }); + }, + + appendFile: function(file, text) { + return new Promise(function(resolve, reject) { + fs.appendFile(file, text, 'utf8', function(err) { + if (err) { + reject('There was an error'); + } else { + resolve(fsp.readFile(file)); + } + }); + }); + } +}; + +module.exports = fsp; diff --git a/index.js b/index.js new file mode 100644 index 0000000..fc2cb3d --- /dev/null +++ b/index.js @@ -0,0 +1,156 @@ +// Warmups + +// 1. + +var p = new Promise(function() { + setTimeout(function() { + console.log("Hello Promise!"); + }, 1000); +}); + +p.then(function(messsage) { + console.log(message); +}); + +// 2. + +var delayedMilliseconds; + +function sleep(delay) { + var start = new Date().getTime(); + while (new Date().getTime() < start + delay); +} + +function delay(milliseconds) { + delayedMilliseconds = milliseconds; + + return new Promise(function() { + sleep(milliseconds); + console.log(milliseconds); + }); +} + +function countDown() { + if (delayedMilliseconds > 100) { + delayedMilliseconds -= 100; + } else { + delayedMilliseconds = "Done!"; + } + + delay(delayedMilliseconds); +} + +delay(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. + +function square(num) { + return new Promise(function(resolve, reject) { + if (isNaN(num)) { + reject("'" + num + "' is not a number"); + } else { + resolve(num * num); + } + }); +} + +var nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]; + +nums = nums.map(function(i) { + return square(i); +}); + +Promise.all(nums) + .then(function(results) { + console.log(results); +}); + +// 4. + +function doBadThing(forRealz) { + return new Promise(function(resolve, reject) { + if (!forRealz) { + resolve("Yay!"); + } else { + reject("Noooooo!"); + } + }); +} + +// :) Path using reject handler +doBadThing(0) + .then(function(results) { + console.log(results); + }, function(err) { + console.error(err); + }); + +// :( Path using reject handler +doBadThing(1) + .then(function(results) { + console.log(results); + }, function(err) { + console.error(err); + }); + +// :) Path using .catch +doBadThing(0) + .then(function(results) { + console.log(results); + }) + .catch(function(err) { + console.error(err); + }); + +// :( Path using .catch +doBadThing(1) + .then(function(results) { + console.log(results); + }) + .catch(function(err) { + console.error(err); + }); + + + +// Create an Event Emitter from Scratch + +var Emitter = require('./event_emitter'); +// var Emitter = require('events'); +var emitter = new Emitter(); + +function clickCallback() { + console.log('clicked'); +} + +function clickedAgainCallback() { + console.log('clicked again'); +} + +emitter.on('click', clickCallback); + +emitter.on('click', clickedAgainCallback); + +emitter.on('submit', function() { + console.log('submitted'); +}); + +emitter.emit('click'); + +emitter.removeListener('click', clickCallback); + +console.log("Removed the 'click' listener with the 'clickedAgainCallback', now there are " + emitter.listenerCount('click') + " 'click' event listeners"); + +emitter.removeAllListeners('click'); + +console.log("Removed all 'click' listeners, now there are " + emitter.listenerCount('click'));