我在做出一系列承诺时遇到了一些困难。我有以下云功能
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<admin.auth.UserRecord, FirebaseFirestore.WriteResult>(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)
但是为什么?我匹配了承诺的返回类型。我做错了什么?
看起来你的承诺类型在你把它们推入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]);