誓いを使用する場合のAmplify.Hub signInハンドラーの競合状態


8

コード例:

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);
  }
});

宣誓を使用する場合、プロバイダーが私のアプリにリダイレクトした後、ハブはsignInイベントを発生させます。ただし、signInUserSessionプロパティはnullイベント発生したときですが、しばらくしてから(100ミリ秒以内)値を取得します。これはAuth.signIn(email, password)直接使用する場合は発生しないようです。signInUserSessionイベントが発生したときに入力されます。

ここで何が起こっているのですか、どうすれば回避できますか?現在、私はコードに明示的な遅延があります。これはひどいハックです。


使用しているバージョンは何ですか?使用していないアプリでこれを再現しようとしましたが、うまく
いき

JavaScriptでもpromiseを使用できます。
Prabhat

このイベントをどこでどのようにリッスンしていますか?コンポーネントまたは任意のシングルトンクラスのコード部分ですか?
カーシック

私はredux-sagaを使用Hub.listenしており、イベントチャネルの電源として使用しています。ただし、上記のサンプルコードを佐賀県から直接実行しても同じ問題が発生しました。
Thom Smith、

回答:


2

おそらく、値が入力されるのを待つJavaScriptの古い方法は、値の入力に予想以上に時間がかかってもコードが失敗しないようにするのに役立ちます。

以下は、他に利用できるオプションがないときに通常使用するサンプルコードです。

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

このサンプルコードは、必要に応じてリファクタリングできます。

または、AWS Amplifyには、現在ログインしているユーザーセッションを取得する他の方法もあります。たとえばAuth.currentAuthenticatedUser()Auth.currentSession()約束を返します。彼らはこのように使用できます

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

0

私はaws amplifyに慣れていません-githubを読んでください。これまでのところ、私たちはあなたの情報が必要であることを確認できます userPool実装 -奇妙なコールバックの問題だと思います

ただし、回避策として、参照をプロキシすることができます。

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>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.