From 93164b1f8ead1612452861618813dc893c6a3409 Mon Sep 17 00:00:00 2001 From: Shihang Zhu Date: Fri, 11 May 2018 16:44:42 -0400 Subject: [PATCH] finished 1-8 --- src/assignment.js | 81 +++++++++++++++++++++++++++++++++++++++++- src/dumb_async_api.js | 57 ++++++++++++++++++++++++++++- src/extra_question.js | 32 ++++++++++++++++- src/extra_question2.js | 81 ++++++++++++++++++++++++++++-------------- 4 files changed, 222 insertions(+), 29 deletions(-) diff --git a/src/assignment.js b/src/assignment.js index ef4ff34..66445fc 100644 --- a/src/assignment.js +++ b/src/assignment.js @@ -7,6 +7,15 @@ var q = require("q"); // Promises package Node.js * control over them at the moment. **/ +function exercise1(){ + dumb_async_api.async1(); + dumb_async_api.async2(); + dumb_async_api.async3(); + dumb_async_api.async4(); + dumb_async_api.async5(); +} + + /** * Exercise 2: @@ -27,7 +36,30 @@ var q = require("q"); // Promises package Node.js * Note: If you want to catch the error with only one catch clause, * return the next promise as you progress through the promises. **/ -var result_str = ""; + +function exercise3(){ + var result_str = ""; + dumb_async_api.async1promisified().then(function(resolve) { + result_str = result_str + resolve + ", "; + return dumb_async_api.async2promisified(); + }).then(function(resolve) { + result_str = result_str + resolve + ", "; + return dumb_async_api.async3promisified(); + }).then(function(resolve) { + result_str = result_str + resolve + ", "; + return dumb_async_api.async4promisified(); + }).then(function(resolve) { + result_str = result_str + resolve + ", "; + return dumb_async_api.async5promisified(); + }).then(function(resolve) { + result_str = result_str + resolve; + }).then(function(resolve){ + console.log(result_str); + }); +} + + + /** * Exercise 4: * Use your current promisify API functions, @@ -36,6 +68,18 @@ var result_str = ""; * print 'done', at the end. * Expected Output: "async1, async2, async3, async4, async5" **/ +function exercise4(){ + var promise1 = dumb_async_api.async1promisified(); + var promise2 = dumb_async_api.async2promisified(); + var promise3 = dumb_async_api.async3promisified(); + var promise4 = dumb_async_api.async4promisified(); + var promise5 = dumb_async_api.async5promisified(); + + q.all([promise1, promise2,promise3,promise4,promise5]).then(data => { + console.log(data); + }).then(data => console.log('done')); +} + /** * Exercise 5: @@ -44,12 +88,41 @@ var result_str = ""; * printing to the console 'done' after they are all finished. **/ +function exercise5(){ + var result_str = ""; + var promise2 = dumb_async_api.async2promisified(); + var promise3 = dumb_async_api.async3promisified(); + var promise4 = dumb_async_api.async4promisified(); + var promise5 = dumb_async_api.async5promisified(); + dumb_async_api.async1promisified().then(function(resolve){ + result_str = result_str + resolve + ", "; + return q.all([promise2,promise3,promise4,promise5]); + }).then(data => { + result_str = result_str + data; + console.log(result_str); + }).then(data => console.log('done')); +} + /** * Exercise 6: * Call the function below, twice, for the error and success cases, and apply the then/catch clause to print * the result, in the case of error, print error to the console. */ +function exercise6(){ + async6promisified(5).then((resolve)=>{ + console.log(resolve); + return async6promisified(15); + }).then((resolve)=>{ + console.log(resolve); + }).catch((err)=>{ + console.log(err.message); + }); +} + + + + /** * @name async6promisified * @desc Async function, rejects error randomly, given a parameter @@ -68,3 +141,9 @@ function async6promisified(param) } +// DRIVER +// exercise1(); +// exercise3(); +// exercise4(); +// exercise5(); +// exercise6(); \ No newline at end of file diff --git a/src/dumb_async_api.js b/src/dumb_async_api.js index 23cde1d..c8c746b 100644 --- a/src/dumb_async_api.js +++ b/src/dumb_async_api.js @@ -9,7 +9,12 @@ module.exports = { async2:async2, async3:async3, async4:async4, - async5:async5 + async5:async5, + async1promisified:async1promisified, + async2promisified:async2promisified, + async3promisified:async3promisified, + async4promisified:async4promisified, + async5promisified:async5promisified, }; /** @@ -21,6 +26,7 @@ function async1() setTimeout(function(){ console.log("async1"); },5*Math.random()); + return 1; } /** * @name async2 @@ -64,3 +70,52 @@ function async5() } +function async1promisified() { + var deferred = q.defer(); + + setTimeout(function(){ + deferred.resolve("async1"); + },5*Math.random()); + + return deferred.promise; +} + +function async2promisified() { + var deferred = q.defer(); + + setTimeout(function(){ + deferred.resolve("async2"); + },5*Math.random()); + + return deferred.promise; +} + +function async3promisified() { + var deferred = q.defer(); + + setTimeout(function(){ + deferred.resolve("async3"); + },5*Math.random()); + + return deferred.promise; +} + +function async4promisified() { + var deferred = q.defer(); + + setTimeout(function(){ + deferred.resolve("async4"); + },5*Math.random()); + + return deferred.promise; +} + +function async5promisified() { + var deferred = q.defer(); + + setTimeout(function(){ + deferred.resolve("async5"); + },5*Math.random()); + + return deferred.promise; +} \ No newline at end of file diff --git a/src/extra_question.js b/src/extra_question.js index 53235f9..18f902d 100644 --- a/src/extra_question.js +++ b/src/extra_question.js @@ -1,4 +1,4 @@ -var s = require("./dumb_async_api"); // Async API +var dumb_async_api = require("./dumb_async_api"); // Async API var q = require("q"); @@ -14,3 +14,33 @@ var q = require("q"); * @param {Array} promises * @returns {*|PromiseLike} */ +function qAll(promises){ + var deferred = q.defer(); + var data = []; + var ctr = 0; + var length = promises.length; + for (let i = 0; i < length; i++){ + promises[i].then(resolve => { + data[i] = resolve; + ctr++; + if(ctr == length){ + deferred.resolve(data); + } + }); + } + + return deferred.promise; +} + + +var promise1 = dumb_async_api.async1promisified(); +var promise2 = dumb_async_api.async2promisified(); +var promise3 = dumb_async_api.async3promisified(); +var promise4 = dumb_async_api.async4promisified(); +var promise5 = dumb_async_api.async5promisified(); + +qAll([promise1,promise2,promise3,promise4,promise5]).then(data => { + console.log(data); +}, reject=>{ + console.log(reject); +}).then(() => console.log('done')); \ No newline at end of file diff --git a/src/extra_question2.js b/src/extra_question2.js index a63423f..98dc329 100644 --- a/src/extra_question2.js +++ b/src/extra_question2.js @@ -1,35 +1,64 @@ - /** - * Exercise 8: - * Consider the simple function below and explain in terms of the JavaScript - * execution stack, event loop, and message queue the order of execution. - * I expect a discussion of stack and queue contents at each point of the program. - * - */ +/** + * Exercise 8: + * Consider the simple function below and explain in terms of the JavaScript + * execution stack, event loop, and message queue the order of execution. + * I expect a discussion of stack and queue contents at each point of the program. + * + */ + +function async() { + console.log("a"); // A + setTimeout(function () { + console.log("b"); // B + }, 2000); + console.log("c"); // C +} + +/* +Process of the code above by computer: +1. A is pushed into stack and print 'a' +2. setTimeout is pushed into stack. It let me wait for 2 seconds... ok, add function B into queue and do it after 2 seconds +3. C is pushed into stack and print 'c' +4. stack is empty... waiting... 2 seconds is quite a long time for me +5. here we go, execute function B and print 'b' + */ - function async() - { - console.log("a"); - setTimeout(function(){ - console.log("b"); - },2000); - console.log("c"); - } /** * Exercise 9: - * Consider the following event emitter and listener function, convert the + * Consider the following event emitter and listener function, convert the * 'on' event into Promise syntax. Add the appropriate reject and resolve clauses. * If an error occurs, print the error message through error.message. before rejecting the promise * If sucessful print, "Ok" */ -var MyEventEmitter = require('./myEmitter'); -const myEmitter = new MyEventEmitter(); -// TODO: Create a function that promisifies the event listener. -// -// -myEmitter.on('event', function(error, data){ - // Handle -}); -myEmitter.emit('event',null,{"message":"Hello!"}); -myEmitter.emit('event',new Error("An error occurred"),null); +// const MyEventEmitter = require('events'); +// const myEmitter = new MyEventEmitter(); +// +// var emit = promisify(myEmitter.emit); +// function sad(param) +// { +// return new Promise((resolve,reject)=>{ +// myEmitter.emit... +// myEmitter.on('',()=>{ +// +// }); +// }); +// +// +// } +// myEmitter.on('event', function (error, data) { +// if (error) { +// console.log(error.message); +// } +// if (data) { +// console.log(data); +// } +// +// }); +// myEmitter.emit('event', null, {"message": "Hello!"}) +// .then((resolve)=>{console.log(resolve);}) +// .catch(err => console.log(err)); +// myEmitter.emit('event', new Error("An error occurred"), null).then() +// .then((resolve)=>{console.log(resolve);}) +// .catch(err => console.log(err)); \ No newline at end of file