21.6. Asynchronicity II

21.6.1. Asynchronicity in Readable Practice

Example 21.6. Practically, the async/await Way. test111.js
"use strict";
/*
 * based on https://stackoverflow.com/questions/54901478/js-how-to-call-an-async-function-within-a-promise-then
 */
const simulatedSlowDiskOp = function (t) {
      setTimeout( function() {
        console.log(`delayed ${t} msec`);
      }, t);
};

const egConnect = async function () {
      console.log("first");
      await simulatedSlowDiskOp(500);
      return "connected";
};

const egRetrieve = async function (p1) {
      console.log(p1 + " second");
      await simulatedSlowDiskOp(200);
      return "retrieved";
};

const getSomethingFromSlowDisk = function () {
    return new Promise(async function (resolve, reject) {
        let x = await egConnect();
        let y = await egRetrieve(x);
        console.log(y + " last");
        resolve(y);
        reject(error);
    });
};

getSomethingFromSlowDisk();

And its execution

$ node test111
first
connected second
retrieved last
delayed 200 msec
delayed 500 msec

21.6.2. Applied to a MongoDB connection and CRUD activity

Example 21.7. Practically, the async/await Way on Mongo. mongoWrap.js
"use strict";
/*
 * wrapper for CRUD functionality of a mongodb
 */
const mongo = require('mongodb').MongoClient;
const conparam = { useNewUrlParser: true, useUnifiedTopology: true};

exports.retrieve = async function(url, dbn, coll, query) {
    const constr = `mongodb://${url}:27017`;
    const con = await mongo.connect(constr, conparam);
    const db = con.db(dbn);
    let stuff = null;
    try {
        stuff = await db.collection(coll).find(query).toArray();
    } catch(err) {
        console.log(error);
    } finally {
        con.close();
        return stuff;
    }
}

exports.upsert = async function(url, dbn, coll, query, chk) {
    const constr = `mongodb://${url}:27017`;
    const con = await mongo.connect(constr, conparam);
    const db = con.db(dbn);
    let stuff = null;
    try {
        stuff = await db.collection(coll).updateOne(chk, {"$set": query}, {upsert: true});
    } catch(err) {
        console.log(error);
    } finally {
        con.close();
        return stuff;
    }
}

This can be tested by

Example 21.8. Testing async/await on Mongo. test117.js
"use strict";
const mon = require("./mongoWrap");
mon.retrieve("localhost", "world", "country", {name: "Canada"});


mon.retrieve("localhost", "world", "city", {name: "Aarhus"});