【问题标题】:TypeScript: Return Result of a PromiseTypeScript:返回一个承诺的结果
【发布时间】:2017-09-10 19:07:07
【问题描述】:

我正在开发一个使用 Fireface Login 和 Facebook 的 Ionic 应用程序。为此,我在这里关注了文档:https://github.com/angular/angularfire2/blob/master/docs/Auth-with-Ionic2.md

几乎在文档的末尾,您可以看到进行 FB 登录的一段代码(如果可用,请使用本机 FB 应用程序):

  signInWithFacebook(): firebase.Promise<FirebaseAuthState> {
    if (this.platform.is('cordova')) {
      return Facebook.login(['email', 'public_profile']).then(res => {
        const facebookCredential = firebase.auth.FacebookAuthProvider.credential(res.authResponse.accessToken);
        return firebase.auth().signInWithCredential(facebookCredential);
      });
    } else {
      ...
    }
  }

这种搞砸了方法signInWithFacebook的返回类型。实际上,该方法应该返回由 Facebook.login(...) 触发的 Promise 的结果——但它确实返回了具有不同数据类型的 FacebookLogin-Promise 本身。 我有点困惑如何重新建模这些行以正确返回由 firebase.auth().signInWithCredential(facebookCredential) 创建的 Promise。

你有什么提示/想法吗?

提前非常感谢!

【问题讨论】:

  • 没有使用过标志性的库,所以不知道你到底在引用什么。你能更详细地解释一下“。实际上方法应该返回”
  • signInWithFacebook 的返回类型是 firebase.Promise。但是 Facebook.login() 的返回类型是 Promise - 这是不兼容的。但是 Facebook.login() 的已解决 Promise 的结果将适合 signInWithFacebook 的方法定义。我尝试做的是返回已解决的 Promise(由 Facebook.login() 创建)的结果,而不是 Promise 本身。
  • return firebase.auth.FacebookAuthProvider.credential(res.authResponse.accessToken).then((facebookCredential)=&gt;firebase.auth().signInWithCredential(facebookCredential)); 呢?
  • 我如何获得 res.authRespon‌​se.accessToken?这是我在您的建议中找不到的“外部”承诺(通过 Facebook-login())结果的一部分

标签: typescript ionic-framework promise


【解决方案1】:

好的,这里有一个解决方案(或变通方法——随便你怎么称呼它)。

我改变了什么:

  • signInWithFacebook 方法确实返回 void
  • 它采用匿名函数作为参数,当内部 Promise 解析时执行

代码如下:

  signInWithFacebook(success: (FirebaseAuthState) => void): void {
    if (this.platform.is('cordova')) {
      Facebook.login(['email', 'public_profile']).then(res =>
        {
          const facebookCredential = firebase.auth.FacebookAuthProvider.credential(res.authResponse.accessToken);
          firebase.auth().signInWithCredential(facebookCredential).then( fbas => success(fbas));
        }
      );
    }
    else {
      this.auth$.login({
          provider: AuthProviders.Facebook,
          method: AuthMethods.Popup
        }).then(res => success(res));
    }
  }

这是调用方法的方法:

this._auth.signInWithFacebook2(res => {...});

【讨论】:

    猜你喜欢
    • 2017-05-16
    • 2017-12-21
    • 2015-11-27
    • 1970-01-01
    • 2015-06-05
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多