Race-Bedingung im Amplify.Hub-SignIn-Handler bei Verwendung des Eides


8

Beispielcode:

Hub.listen('auth', event => {
  const { event: type, data } = event.payload;

  if (type === 'signIn') {
    const session = data.signInUserSession;
    console.log('SESSION', data.signInUserSession);
    setTimeout(() => {
      console.log('SESSION', data.signInUserSession);
    }, 100);
  }
});

Bei Verwendung von Eid löst der Hub ein signInEreignis aus , nachdem der Anbieter zu meiner App weitergeleitet hat . Die signInUserSessionEigenschaft ist jedochnull wenn das Ereignis ausgelöst wird, erhält jedoch einige Zeit später (innerhalb von 100 ms) einen Wert. Dies scheint bei Auth.signIn(email, password)direkter Verwendung nicht aufzutreten . signInUserSessionwird ausgefüllt, wenn das Ereignis ausgelöst wird.

Was passiert hier und wie kann ich es umgehen? Derzeit habe ich eine explizite Verzögerung im Code, was ein schrecklicher Hack ist.


Welche Version verwenden Sie? Ich habe versucht, dies in der App zu reproduzieren, die ich nicht erfolgreich
benutze

Sie können Versprechen auch in Javascript verwenden.
Prabhat

Wo oder wie hören Sie dieses Ereignis, ist der Code Teil einer Komponente oder einer Singleton-Klasse?
Karthick

Ich verwende Redux-Saga und Hub.listenversorge einen Ereigniskanal mit Strom. Ich habe jedoch auch versucht, den obigen Beispielcode direkt aus einer Saga auszuführen, und hatte das gleiche Problem.
Thom Smith

Antworten:


2

Möglicherweise ist die alte Methode von JavaScript zum Warten auf das Auffüllen von Werten hilfreich, um sicherzustellen, dass Code nicht fehlschlägt, selbst wenn das Auffüllen des Werts länger als erwartet dauert.

Hier ist ein Beispielcode, den ich normalerweise verwende, wenn keine anderen Optionen verfügbar sind.

waitForValue(){
    if(myVar!= null && typeof myVar !== "undefined"){
        //value exists, do what you want
        console.log(myVar)
    }
    else{
        setTimeout(() => {this.waitForValue()}, 100);
    }
}

Sie können diesen Beispielcode nach Ihren Wünschen umgestalten.

Alternativ bietet AWS Amplify auch andere Möglichkeiten, um die aktuell angemeldete Benutzersitzung abzurufen. zB Auth.currentAuthenticatedUser()und Auth.currentSession()Versprechen zurückgeben. Sie können so verwendet werden

private async getUser(){
    let user = null;
    try {
      user = await Auth.currentAuthenticatedUser();
      //console.log(user);
    } catch (err) {
      //console.log(err);
    }
    //return user;
  }

0

Ich bin es nicht gewohnt, aws zu verstärken - lesen Sie einfach etwas Github und bis jetzt kann ich sehen, dass wir Informationen über Ihre userPoolImplementierung benötigen - ich denke, ein seltsames Rückrufproblem

Für eine Problemumgehung können Sie die Referenz als Proxy verwenden:

const event = {type: "signIn", data: {signInProperty: "null"}}

setTimeout(()=>event.data.signInProperty = "{Stack: Overflow}", 1000)

// mock events
function emit(type, args){
  console.log(type, args)
}

//initialize
let watchedValue = event.data.signInProperty
document.getElementById("app").innerHTML = event.data.signInProperty 
// protect reference
Object.defineProperty(event.data, "signInProperty", {
    set(newValue){
      watchedValue = newValue
      document.getElementById("app").innerHTML = newValue
      emit("event:signInCompleted", event.data)
    },
    get(){
      return watchedValue
    }
})
<div id="app"></div>

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.