var users;
function makeHttpReq(method, url) {
    return new Promise(function (resolve, reject) {
        var xhr = new XMLHttpRequest();
        xhr.open(method, url);
        xhr.onload = function () {
            if (this.status == 200) {
                resolve(xhr.response); //se la chiamata ha risposto con uno status code di successo allora mettiamo la promise in resolved
            } else {
                reject({ //se la chiamata non ha risposto con 200 mettiamo la promise in rejected
                    status: this.status,
                    statusText: xhr.statusText
                });
            }
        };
        xhr.onerror = function () {
            reject({ //se ci sono stati degli errori per cui la chiamata non è andata a buon fine mettiamo la promise in rejected
                status: this.status,
                statusText: xhr.statusText
            });
        };
        xhr.send();
    });
}

makeHttpReq('GET', 'http://jsonplaceholder.typicode.com/users')
    .then(function (res) { //dentro la funzione then si possono passare 2 callback, la prima viene eseguita se la promise viene resolved
        users = res;
        console.log("2", users); //alla fine, quando la promise si è conclusa con successo, viene stampata la risposta della chiamata
    }, function (error) { //la seconda callback viene eseguita se la promise viene rejected
        console.log(error);
        console.log("3", users); //questa riga non viene stampata se non si verificano errori
    });

console.log("1", users); //viene stampata prima questa riga, che viene eseguita in modo sincrono
//in questo momento la Promise non si è ancora conclusa perciò gli users sono ancora undefined

//qui sbagliamo l'url in modo che la chiamata dia uno status code diverso da 200
makeHttpReq('GET', 'http://jsonplaceholder.typicode.com/usersssssss')
    .then(function (res) {
        users = res;
        console.log("4", users); //questa riga non verrà stampata 
    }, function (error) {
        console.log(error); //{status: 404, statusText: "Not Found"}
    });


//usando async / await
async function makeAsyncReq() {
    let response = await makeHttpReq('GET', 'http://jsonplaceholder.typicode.com/users');
    return response;
}

makeAsyncReq()
.then(
    function(res) {
        users = res;
        console.log("users", users);
    },
    function() {
        console.log.log(error);
    }
);

//facciamo la stessa chiamata ma usando la funzione fetch
//concateniamo insieme due then e alla fine la catch
var request = new Request('http://jsonplaceholder.typicode.com/users', {
    method: 'GET'
});
fetch(request)
    .then(function (resp) {
        return resp.json();//la risposta che arriva dalla fetch deve prima essere trasformata in JSON
    }) //Attenzione, niente punto e virgola!
    .then(function (data) {
        console.log(data);
    }) //Attenzione, niente punto e virgola!
    .catch(function (error) {
        console.log(error); //qui solo se network error o request non completata
    });

//alla then passiamo solo la success function perchè fetch sarà sempre resolved
var request = new Request('http://jsonplaceholder.typicode.com/userssssssss', {//sbagliamo l'url
    method: 'GET'
});
fetch(request)
    .then(function (resp) {
        if (resp.status == 200) {
            return resp.json();
        }
        else {
            return { status: resp.status, statusText: resp.statusText }
        }

    })
    .then(function (data) {
        console.log(data); //{status: 404, statusText: "Not Found"}
    })
    .catch(function (error) {
        console.log(error);
    });

//usando async / await
async function getUsersRight() {
    try {
        let response = await fetch('http://jsonplaceholder.typicode.com/users');
        return response.json();
    } catch (err) {
        console.error(err);
    }
}

getUsersRight()
    .then(function (res) {
        console.log(res);
    });

async function getUsersWrong() {
    try {
        let response = await fetch('http://jsonplaceholder.typicode.com/usersssssss'); //sbagliamol'url per avere un 404
        if (response.status == 200) {
            return response.json();
        }
        else {
            return {status: response.status, statusText: response.statusText}
        }
    } catch (err) {
        throw new Error(err);
    }
}

getUsersWrong()
    .then(function (res) {
        console.log(res); //{status: 404, statusText: "Not Found"}
    });

//cancellare una fetch
var controller = new AbortController();
var signal = controller.signal;

fetch("http://jsonplaceholder.typicode.com/posts", {
  signal: signal
}).then(function (response) {
  console.log(response);
}).catch(function (e) {
  console.warn(e);
});

setTimeout(function () {
  return controller.abort();
}, 100);