A Promise is an object that can be passed or returned and holds reference to the outcome of asynchronous behavior. In Angular they are created through the $q service.
$q.defer()
creates an object that has special methods, among then resolve()
and reject()
. The resolve()
method indicates successful completion of the execution and wraps the data for the promise to return later on. If something goes wrong the reject()
method should be called, sending an error object or error message.
This function should have a caller, and this caller should capture a reference to the promise object.
Here is where the then()
method can be called to obtain the results or handle the errors according to the case. Notice that the then()
method takes 2 arguments, which are the functions that are going to be executed in case of success, or in case of error.
In link3 you can see one part of the code has the definition of the asynchronous function named getData
and later there is the call to then()
to obtain the results, this call is made by the caller of the asynchronous function getData
.
In link2 Controller FatherCtrl is the one calling then()
to process the response of the Service SonService. It may be confusing that there is also a call to the then()
method in the SonService, but this is to obtain the result of the HTTP GET call, as the comment properly explains it:
// the $http API is based on the deferred/promise APIs exposed by the $q service
// so it returns a promise for us by default
In this example you only see the then()
part because the get()
method of the $http
service is an asyncronous function that upon completion is making the resolve()
or reject()
method call accordingly.
From the official documentation:
The $http service is a function which takes a single argument — a configuration object — that is used to generate an HTTP request and returns a promise.
And again, what is a promise? Check the beginning of this answer. The code for the methods of the $http
service have been written already. When any of this methods are called, and they finish they call either resolve()
or reject()
. The developer has to write code accordingly to read this outcome. (Yes, this is the then()
that you we were talking about in the comments ;) ).