Search code examples
apiecmascript-6promiseloopback

When does a strongloop promise execute the database call?


I was refactoring someone elses code.

let promiseObj = Application.models.Widget.findById(connection.childId)

    if (connection.child != 'Widget') {
        typeES = "media"
        promiseObj = Application.models.Media.findById(connection.childId)
    }

promiseObj.then((obj) => {
  let ownerId = obj.ownerId
  let promiseUser = Application.models.MyUser.findById(ownerId)
})

The question is, does the server get called when "let promiseObj = Application.models.Widget.findById(connection.childId)" is declared.

Or does the server get called when the .then is declared as the promise have a way to be fulfilled.

This is loopback with ES6.

Thanks guys/girls :D


Solution

  • As Erazihel is explaining, the declaration does not fire the resolve, it is called when you call .then()

    I made a simple example in order to visualize the effect, there you will check that the time of the resolve matches the time where you call .then(), not on declaration.

    p1.then(
        // Then calls the resolve so the execution time 'resolve' matches .then
        function(val) {
            var timeMeAgain =  new Date().toLocaleString();
          log.insertAdjacentHTML('beforeend', val.thisPromiseCount +
            ') Promise done, then is called here (<small>Async call finished, .then called at: '+timeMeAgain+', promise executed at": '+val.timeCalledAt+' </small>)<br/>');
        })
    

    Check the example code here

    *Code is based in the MDN example. Check documentation here


    EDIT

    About the resolve method, as the MDN documentation explains:

    The method returns a Promise object that is resolved with the given value. If the value is a thenable (i.e. has a "then" method), the returned promise will "follow" that thenable, adopting its eventual state; otherwise the returned promise will be fulfilled with the value.

    Meaning that the response object will be returned when the Database or endpoint returns the information, not on declaration of the promise.