javascript嵌套异步调用

时间:2017-05-15 09:02:26

标签: ecmascript-6 promise es6-promise oidc-client-js

我的脚本有一个登录用户的功能,如下所示:

class myClient {
    SignIn() {
            this._userManager.signinRedirect();      

            this._userManager.processSigninResponse().then(function (response) {               

                manager._userManager.getUser().then(function (user) {
                    manager._loggedUser = user;
                });        
            })
        }
}

如您所见,有两个嵌套的承诺。一旦最内部的承诺得到解决(即:manager._loggedUser = user

,用户才会登录系统

现在,我希望我的类只公开两个方法:SignIn()[如上所述]和GetUserInfo():

GetUserInfo() {
     // ...
    return this._loggedUser;
}; 

因此,任何使用我的课程的人都需要按照以下步骤来获取登录的用户个人资料:

  1. 创建对象
  2. 调用signin方法
  3. 获取用户信息
  4. 我如何'同步'第2步和第3步,以确保在首先调用signin()方法和之后调用GetUserInfo()之后_loggedUser不为空?

1 个答案:

答案 0 :(得分:0)

应该扁平化以避免“回调地狱”(使用承诺的原因之一) - 除非有理由不这样做(即在嵌套承诺中使用response时)。它应该回报一个承诺。

SignIn() {
  this._userManager.signinRedirect();      

  return this._userManager.processSigninResponse().then(function (response) {               
    return manager._userManager.getUser();
  })
  .then(function (user) {
    manager._loggedUser = user;
  });        
}

考虑到GetUserInfo依赖于SignIn结果,在使用它们时应该使用承诺。

obj.SignIn().then(() => {
  const info = obj.GetUserInfo();
  ...
});