使用誓言时Amplify.Hub登录处理程序中的竞争条件

示例代码:

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

这里发生了什么,我该如何解决?目前,我在代码中存在明显的延迟,这是一个可怕的骇客。

tuzimao1 回答:使用誓言时Amplify.Hub登录处理程序中的竞争条件

也许用旧的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;
  }
,

我不习惯aws放大-只是阅读一些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>

本文链接:https://www.f2er.com/3136307.html

大家都在问