在Promise

时间:2017-12-03 16:31:23

标签: javascript typescript promise auth0 asynccallback

auth0.js有一个函数,用于解析URL哈希片段并从中提取身份验证结果。我将这个函数包装在一个名为loadSession的函数中,如下所示:

public loadSession(): void {
  this.auth0.parseHash((err, authResult) => {
    if (authResult) {
      window.location.hash = '';
      localStorage.setItem('token', authResult.accessToken);
      // TODO (1)
    } else if (err) {
      // TODO (2)
    }
  });
}

如上所示,parseHash将回调函数作为参数,我无法控制它。我希望loadSession返回Promise,该// TODO (1)将在// TODO (2)处得到解决,并在obj.loadSession().then(() => { // do something if successful }).catch((err) => { // raise error if not })处被拒绝。这样我可以 $query = "SELECT adapterType FROM repair WHERE repairID = '$repairID'"; $result = mysqli_query($mysqli, $query); list($adapter) = mysqli_fetch_row($result);

4 个答案:

答案 0 :(得分:3)

只需将其包含在承诺中:

public loadSession() {
    return new Promise((resolve, reject) => {
        this.auth0.parseHash((err, authResult) => {
            if(authResult) {
                window.location.hash = '';
                localStorage.setItem('token', authResult.accessToken);
                resolve(authResult);
            } else if (err) {
                reject(err);
            }
        });
    });
}

答案 1 :(得分:1)

你几乎可以将任何回调函数传递给一个返回给定的函数的函数:

  1. 回调是最后一个参数
  2. 回调函数会将错误视为第一个参数
  3. 以下是一个例子:

    --- a/client/.babelrc
    +++ b/client/.babelrc
    @@ -5,10 +5,6 @@
         }],
         "stage-2"
       ],
    -  "plugins":  ({
    -  new webpack.DefinePlugin({
    -            'process.env.NODE_ENV': JSON.stringify('development')
    -        }),
       "env": {
         "test": {
           "presets": ["env", "stage-2"],
    

答案 2 :(得分:0)

public loadSession(): Promise {
  return new Promise((resolve, reject) => {
    this.auth0.parseHash((err, authResult) => {
    if (authResult) {
      window.location.hash = '';
      localStorage.setItem('token', authResult.accessToken);
      // TODO (1)
      // resolve(something)
    } else if (err) {
      // TODO (2)
      // reject(something)
    }
  });
}

有关使用Promise API的详情,请访问MDN Docs

答案 3 :(得分:0)

或者你可以使用一个很小的库来为你做到这一点:GitHub上的promisify-auth0,npmjs.org上的promisify-auth0

现已更新为版本9.5.1