Promises Exercise

As a reference, here is the earlier work we had done for getUser:

Callback pattern
function getUser(id, callback) {
  console.log("Reading a user from a database...");
  setTimeout(() => {
    console.log("Received user data...");
    callback({ "ID": id, "Account number": "58721094531267" });
  }, 2000);
}

console.log("listening for events");
getUser(1, (user) => console.log(user));
console.log("still listening for events!");
Promise pattern
function getUser(id) {
  console.log("Reading a user from a database...");
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log("Received user data...");
      resolve({ ID: id, "Account number": "58721094531267" });
    }, 2000);
  });
}

console.log("listening for events");
getUser(1)
  .then((user) => console.log(user));
console.log("still listening for events!");

I've ignored the case where the Promise may be "rejected" to keep the example concise.

Exercise Update the following code to use Promises instead of callbacks.

function getUser(id, callback) {
  console.log("Reading a user from a database...");
  setTimeout(() => {
    console.log("Received user data...");
    callback({ ID: id, "Account number": "58721094531267" });
  }, 2000);
}

function getLoans(account, callback) {
  console.log("Request for loan data...");
  setTimeout(() => {
    console.log("Received loan data...");
    callback({ "Most recent": "loan 3", All: ["loan 1", "loan 2", "loan 3"] });
  }, 2000);
}

function getTransactions(loan, callback) {
  console.log("Request for transactions data...");
  setTimeout(() => {
    console.log("Received transactions data...");
    callback(["tran 3", "tran 2", "tran 1"]);
  }, 2000);
}

console.log("listening for events");
getUser(1, (user) => {
  getLoans(user["Account number"], (loans) => {
    getTransactions(loans["Most recent"], (transactions) => {
      console.log(transactions);
    });
  });
});
console.log("still listening for events!");
Solution
function getUser(id) {
  console.log("Reading a user from a database...");
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log("Received user data...");
      resolve({ ID: id, "Account number": "58721094531267" });
    }, 2000);
  });
}

function getLoans(account) {
  console.log("Request for loan data...");
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log("Received loan data...");
      resolve({ "Most recent": "loan 3", All: ["loan 1", "loan 2", "loan 3"] });
    }, 2000);
  });
}

function getTransactions(loan) {
  console.log("Request for transactions data...");
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log("Received transactions data...");
      resolve(["tran 3", "tran 2", "tran 1"]);
    }, 2000);
  });
}

console.log("listening for events");
getUser(1)
  .then(user => getLoans(user["Account number"]))
  .then(loans => getTransactions(loans["Most recent"]))
  .then(transactions => console.log(transactions));
console.log("still listening for events!");