Не удается найти имя в Angular TypeScript

Я не понимаю, почему я не могу вызвать createUser (..)

Сначала renderButton () - это вызов, затем initClient (), но «this» не определено в этой функции, почему? Я предполагаю, что из-за этого я не могу вызывать другие функции.

редактировать: я понял, что this уже не определено в начале initClient() . Если я изменяю gapi.load('client:auth2', this.initClient); to gapi.load('client:auth2', this.initClient()); , this будет доступно, но client не будет: /

Пожалуйста, просветите меня!

public renderButton() {
    gapi.load('client:auth2', this.initClient);
}

public initClient() {
    let arr = [sessionStorage.getItem("DISCOVERY_DOCS")]

    gapi.client.init({
        apiKey : sessionStorage.getItem("API_KEY"),
        clientId : sessionStorage.getItem("CLIENT_ID"),
        discoveryDocs : arr,
        scope : sessionStorage.getItem("SCOPES")

    }).then(function () {
        gapi.auth2.getAuthInstance().signIn();
        const authInstance = gapi.auth2.getAuthInstance();
        authInstance.grantOfflineAccess()
            .then((res) => {

                this.createUser(authInstance.currentUser.ie, res.code, "GMAIL");

            });

    }, function (error) {
        console.log(error);
    });
}

public createUser(googleUserJson, code, source) {
// do something
}

Всего 2 ответа


this не определено, потому что вы обращаетесь к нему в новой области видимости функции. Чтобы использовать экземпляр объекта класса как this (то, что вы хотите), вы должны использовать функцию стрелки, которая не создает свою привязку this . Вот как это сделать - замените обратные вызовы Promise на функции стрелок:

() => {
    gapi.auth2.getAuthInstance().signIn();
    const authInstance = gapi.auth2.getAuthInstance();
    authInstance.grantOfflineAccess()
      .then((res) => {
          // now "this" will be the expected class instance
          // and you will have the "createUser" method 
          this.createUser(authInstance.currentUser.ie, res.code, "GMAIL");
      });

}, (error) => {
    console.log(error);
}

import { Component, OnInit, NgZone } from '@angular/core'
import { environment } from 'src/environments/environment'
import { Storage } from '@ionic/storage'
declare var gapi : any;


@Component({
  selector: 'app-google',
  templateUrl: './google.page.html',
  styleUrls: ['./google.page.scss'],
})
export class GooglePage implements OnInit {

  constructor(
        private ngZone: NgZone,
        private storage: Storage,
    ) {
    }

  ngOnInit() {

    this.getGTokens()
  }


CLIENT_ID;
API_KEY;
DISCOVERY_DOCS;
SCOPES;






getGTokens() {
    const Http = new XMLHttpRequest();
    const path = 'get_tokens'
    let url = environment.server_url + path; 

    Http.open("GET", url);
    Http.setRequestHeader("Content-Type","application/json;charset=UTF-8");
    Http.setRequestHeader("Token","...");
    Http.send();
    Http.onreadystatechange = (e) => {
        if (Http.readyState == 4 ){
            if (Http.status == 200) {
                var result =  JSON.parse(Http.response);
                this.init(result);
            }else{
                console.log(Http.response);
            }
        }
    }
}


init(json) {

  if (json == null) {
      alert("error : cannot find google tokens file");
  }
  else {
    sessionStorage.setItem('CLIENT_ID', json["CLIENT_ID"]);
    sessionStorage.setItem('API_KEY', json["API_KEY"]);
    sessionStorage.setItem('DISCOVERY_DOCS', json["DISCOVERY_DOCS"]);
    sessionStorage.setItem('SCOPES', json["SCOPES"]);


    console.log("API_KEY : "+sessionStorage.getItem("API_KEY"))
    console.log("CLIENT_ID :"+sessionStorage.getItem("CLIENT_ID"))
    console.log("DISCOVERY_DOCS :"+ sessionStorage.getItem("DISCOVERY_DOCS"))
    console.log("SCOPES :"+sessionStorage.getItem("SCOPES"))



  }

}


public renderButton() {
    console.log(this)
    gapi.load('client:auth2', this.initClient());
}

public initClient() {
console.log(this)
    let arr = [sessionStorage.getItem("DISCOVERY_DOCS")]
    gapi.client.init({

        apiKey : sessionStorage.getItem("API_KEY"),
        clientId : sessionStorage.getItem("CLIENT_ID"),
        discoveryDocs : arr,
        scope : sessionStorage.getItem("SCOPES")
    }).then( () => {
        gapi.auth2.getAuthInstance().signIn();
        const authInstance = gapi.auth2.getAuthInstance();
        authInstance.grantOfflineAccess()
            .then((res) => {
                console.log(this)
                console.log(res)
                console.log(authInstance.currentUser);
                this.createUser(authInstance.currentUser.ie, res.code, "GMAIL");

            });

    }, function (error) {
        console.log(error);
    });
}

public createUser(googleUserJson, code, source) {
    if (googleUserJson.uc == null) {
        alert("Erreur au niveau des information transmise par Google");

    } else {
        googleUserJson.uc.code = code;
        googleUserJson.source = source;
        googleUserJson.email = mail;

        var objectDataString = JSON.stringify(googleUserJson);


        const Http = new XMLHttpRequest();
        const url = '/register_account'

        Http.open("POST", url,true);
        Http.setRequestHeader("Content-Type","application/json;charset=UTF-8");
        Http.setRequestHeader("Token", sessionStorage.getItem("token"));
        Http.send(objectDataString);
        Http.onreadystatechange = (e) => {
            if (Http.readyState == 4 ){
                if ( Http.status == 200) {
                    alert(Http.responseText);
                    // débloquer les boutons synthèses et donnés
                }else{
                     alert(Http.responseText);
                }
            }
        }
     }
}

}


Есть идеи?

10000