class loginCtrl {
constructor(http) {
[this.http, this.name] = [http, 'login'];
}
login() {
console.log(this.http);
console.log(this.name);
}
}
loginCtrl.$inject = ['http'];
let a = new loginCtrl();
a.login();
Après un appel ainsi, http n'est pas défini, mais il peut être imprimé en cliquant sur l'événement.
Que se passe-t-il ? Angular est utilisé pour injecter http.
Le code http est le suivant :
class http {
constructor($http) {
this.$http = $http;
this.options = {
headers: {
'Content-type': 'application/json;charset=utf-8',
'accessToken': 2332
}
}
}
get(data, url, cb) {
let gets = {method: 'GET', params: data, url: url}
Object.assign(gets, this.options)
this.$http(gets).then(function (data) {
console.log('success');
cb(data);
})
}
}
http.$inject = ['$http'];
export default angular.module('http', [])
.service('http', http)
.name;
let a = new loginCtrl(http)
Vous n'avez pas donné http au constructeur
Parce que la méthode que vous avez injectée est une méthode asynchrone et que les autres sont des méthodes synchrones, la méthode synchrone sera exécutée de haut en bas, mais lorsqu'une méthode asynchrone est rencontrée, un nouveau thread sera ouvert pour exécution, cela. c'est-à-dire la méthode que vous injectez dans http et votre méthode de connexion est parallèle et s'exécute directement. Lorsque votre thread de connexion termine son exécution, le thread d'injection HTTP l'imprime avant d'avoir le temps de renvoyer la valeur. Mais après avoir ajouté l'événement click, un thread déclencheur d'événement est ouvert. Lorsqu'un événement est déclenché, le thread ajoutera l'événement à la fin de la file d'attente à traiter. De cette façon, après avoir cliqué, la valeur renvoyée après l'injection http est. reçu, ce qui est probablement le cas.