TypeScript:返回一个承诺的结果

Posted

技术标签:

【中文标题】TypeScript:返回一个承诺的结果【英文标题】:TypeScript: Return Result of a Promise 【发布时间】: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())结果的一部分 【参考方案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 => ...);

【讨论】:

以上是关于TypeScript:返回一个承诺的结果的主要内容,如果未能解决你的问题,请参考以下文章

带有承诺返回错误的 Typescript onPress

为啥 Typescript 认为 async/await 返回包装在承诺中的值?

Typescript/Angular - 模态结果返回后调用单独的函数

关于用 Angular 和 typescript 链接 $q 承诺的困惑

从函数返回承诺

firebase 交易,您必须返回一个承诺