Explorar el Código

updates on observables behaviour

Enzo hace 1 año
padre
commit
20b3fa7794
Se han modificado 1 ficheros con 91 adiciones y 102 borrados
  1. 91 102
      test/test3.ts

+ 91 - 102
test/test3.ts

@@ -1,7 +1,7 @@
 // Test Observable //
 
 import mongoose, { Model } from "mongoose";
-import { Subject, from, map } from "rxjs";
+import { Subject, from, map, of, interval } from "rxjs";
 const used = process.memoryUsage();
 
 let MongooseConnection: mongoose.Connection
@@ -12,6 +12,8 @@ let mongoStorage: any = {
     url: `mongodb://192.168.100.59:27017/fromEnzo`
 }
 
+let testSubject: Subject<any> = new Subject()
+let count = 0
 let data: any[] = []
 
 // Connect to designated storage destination
@@ -37,119 +39,106 @@ async function connectMongo(storage: Storage) {
 }
 
 // Acquire data from Mongo
-async function getMongoData(storage: Storage) {
-    return new Promise<any>(async (resolve, reject) => {
-        await connectMongo(storage);
-        const Message: Model<any> = MongooseConnection.model('Message', require('../types/message.schema'));
-        try {
-            data = await Message.find().limit(100000)
-            resolve(data)
-        } catch (err) {
-            console.error(err);
-        }
+function streamMongoData(storage: Storage, subjectStream: Subject<any>) {
+    connectMongo(storage).then(() => {
+        let message: Model<any> = MongooseConnection.model('Message', require('../types/message.schema'))
+        let stream = message.find().limit(10).cursor()
+
+        stream.on('data', (data: any) => subjectStream.next(data));
+        stream.on('error', (error) => subjectStream.error(error));
+        stream.on('end', () => subjectStream.complete());
     })
+
 }
 
 
 /* --------------- TEST --------------- */
-let testSubject: Subject<any> = new Subject()
-let count = 0
 
-// Using Subjects
-// getMongoData(mongoStorage).then((data) => {
-//     /* putting array into next */
+// testSubject.subscribe({
+//     next: (e) => {
+//         setTimeout(() => {
+//             count++
+//             console.log(count + '. ' + e.appData.msgId) // No problem streaming all the elements from mongo streaming (2.9 milliion)
+//         }, 10000) // But it doesn't wait 10 seconds
+//     }
+// });
+
+function doThis(element: any) {
+    const min = 1;
+    const max = 10;
+    const randomInt = Math.floor(Math.random() * (max - min + 1)) + min;
+    setTimeout(() => {
+        // console.log(`Doing random task for 3 seconds for ${element.appData.msgId}`)
+        console.log(`Doing random task for ${randomInt} seconds for "${element}"`)
+    }, randomInt * 1000)
+}
+async function doThat(element): Promise<any> {
+    return new Promise((resolve, reject) => {
+        const min = 1;
+        const max = 10;
+        const randomInt = Math.floor(Math.random() * (max - min + 1)) + min;
+        setTimeout(() => {
+            // console.log(`Processing ${element.appData.msgId} for 3 seconds`)
+            console.log(`Processing "${element}" for  ${randomInt} seconds`)
+            resolve(element)
+        }, randomInt * 1000)
+    })
+}
 
-//     testSubject.next(data) // returns the entire array as a single value
+/* -------------- ACTION ------------------- */
+// streamMongoData(mongoStorage, testSubject)
+// testSubject.subscribe({
+//     next(element) {
+//         doThat(element).then((data) => {
+//             doThis(data)
+//         })
+//     },
+//     error(err) {
+//         console.error('something wrong occurred: ' + err);
+//     },
+//     complete() {
+//         console.log('done');
+//     },
 // })
 
-/* Letting the system to load the array 1 by 1 into the subject. Speed subject to system/machine */
-getMongoData(mongoStorage).then((data) => {
-    data.forEach(element => {
-        testSubject.next(element)
-    })
+/* --------- Just TESTING and understanding behaviour ---------- */
+/* Explanation: Producer streams at a constant rate of broadcasting 1 data per second. The first task of emitting the value will continue
+without interruptioon, where as the callbacks for doThis() and doThat() will be registered and be called. 
+If the callback is asynchronous, it will register it to the event stack to be executed. And it doesn't have to wait for the previous 
+tasks to complete before it can start it's own tasks. 
+If the callback is synchronous, it will register the callbacks to the event stack to be executed. It doesn't wait for previous 
+tasks to be completed before it can start it's own tasks. */
+let waitForOneSecond = interval(1000)
+waitForOneSecond.subscribe({
+    next(element) {
+        console.log(`Broadcasting: ${element}`)
+        //Asynchrounous Code
+        // doThat(element).then((data) => {
+        //     doThis(data)
+        // })
+        // Synchrounous
+        doThis(element)
+    }
 })
 
-testSubject.subscribe({
-    next: (e) => {
-        count++
-        // console.log(count + '. ' + e.appData.msgId)
-        console.log(count + '. ' + e[0])
-    }
-});
-
-/* -------------- TEST 2 ------------- */
-// Just making Observable from an array
-// getMongoData(mongoStorage).then((data) => {
-//     let observableArray = from(data)
-//     observableArray.subscribe({
-//             next(x: any) {
-//                 count ++
-//                 console.log(count + '. ' + x.appData.msgId)
-//             },
-//             error(err) {
-//                 console.error('something wrong occurred: ' + err);
-//             },
-//             complete() {
-//                 console.log('done');
-//             },
+/* Ignore this for now, just wanted to see how it behaves if the observable is created from arrays. The
+value publishing was too fast, I could derive meaningful comprehension from the data. Plese refer to the
+study case above. */
+// let obsArray = from([1, 2, 3, 4, 5])
+// obsArray.subscribe({
+//     next(element) {
+//         console.log(`Emmitting: ${element}`)
+//         doThat(element).then((data) => {
+//             doThis(data)
 //         })
+//     }
 // })
 
-
-
-
-
-
-
-
-
-
-
-
-/*  Additional Test */
-
-
-// let pipedObs = testSubject.pipe(
-//     map((element) => {
-//         let finalResponse: any = {
-//             message: 'Piped element'
-//         }
-//         return finalResponse
-//     })
-// )
-
-// pipedObs.subscribe(element => {
-//     count ++
-//     console.log(element.message + count)
+// of(1, 2, 3, 4, 5).subscribe({
+//     next(element) {
+//         console.log(`Streaming: ${element}`)
+//         doThat(element).then((data) => {
+//             doThis(data)
+//         })
+//     }
 // })
-
-
-// function doThis() {
-//     count++
-//     console.log(`Task ${count} completed.`)
-//     return count
-// }
-
-// // for (let i = 0; i < 500; i++) {
-// //     setTimeout(() => {
-// //         testSubject.next(doThis())
-// //     }, 500)
-// // }
-
-// function callFunctionRepeatedlyWithFixedDelay() {
-//     let count = 0;
-//     const intervalId = setInterval(() => {
-//         testSubject.next(doThis())
-//         count++;
-//         if (count === 500) {
-//             clearInterval(intervalId);
-//         }
-//     }, 1000);
-// }
-
-// callFunctionRepeatedlyWithFixedDelay()
-// testSubject.subscribe((value) => {
-//     console.log(`Task ${value} acknowledged!`)
-// })  
-
-