【问题标题】:Error Promise.all() attribute is not assignable to parameter错误 Promise.all() 属性不可分配给参数
【发布时间】:2020-04-21 23:22:30
【问题描述】:

我在做出一系列承诺时遇到了一些困难。我有以下云功能

export const updateUser = functions.region('europe-west1').https.onCall(async(data, context) => {
    const userID : string = Authentication.authenticate(context);
    Validator.validateString('displayName', data['displayName']);
    Validator.validateString('photoURL', data['photoURL']);

    const userInfo = {
        displayName:data['displayName'],
        photoURL:data['photoURL'],
    };

    const userReference = await firestore.collection('users').doc(userID);
    const promises = [];
    promises.push(admin.auth().updateUser(userID, {displayName:userInfo.displayName, photoURL:userInfo.photoURL}));
    promises.push(userReference.update(userInfo));
    await Promise.all<admin.auth.UserRecord, FirebaseFirestore.WriteResult>(promises);
});

但是Promise.all&lt;admin.auth.UserRecord, FirebaseFirestore.WriteResult&gt;(promises);给出以下错误

Argument of type '(Promise<WriteResult> | Promise<UserRecord>)[]' is not assignable to parameter of type 'readonly [UserRecord | PromiseLike<UserRecord>, WriteResult | PromiseLike<WriteResult>]'.
  Type '(Promise<WriteResult> | Promise<UserRecord>)[]' is missing the following properties from type 'readonly [UserRecord | PromiseLike<UserRecord>, WriteResult | PromiseLike<WriteResult>]': 0, 1ts(2345)

但是为什么呢?我匹配了承诺的返回类型。我做错了什么?

【问题讨论】:

    标签: typescript promise google-cloud-functions


    【解决方案1】:

    您的 Promise 的类型在您将它们推入 promises 数组后似乎丢失了,该数组本质上是无类型的(在 TypeScript 中没有类型意味着 any)。

    在您的特定情况下,这些承诺的类型甚至都无关紧要,因为除了将它们返回给调用者之外,您没有对它们做任何事情。可调用函数将自动序列化它们并将它们发送回客户端。我建议完全放弃类型并写下这个:

    return Promise.all(promises)
    

    请注意,您实际上必须return 承诺。你不能只是await 它。否则客户端将不会收到任何值。

    如果你想保留类型,你会想避免将它们推入无类型数组,更像这样:

    const p1 = admin.auth().updateUser(userID, {displayName:userInfo.displayName, photoURL:userInfo.photoURL}));
    const p2 = userReference.update(userInfo));
    return Promise.all<admin.auth.UserRecord, FirebaseFirestore.WriteResult>([p1, p2]);
    

    【讨论】:

      猜你喜欢
      • 2021-05-26
      • 2018-11-17
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 2020-05-10
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多