在deleteProject中调用deleteTranslations提示未定义的技术求助
问题解决思路
核心原因
deleteTranslations 是当前对象的方法,在 deleteProject 内部直接调用时,当前作用域找不到这个变量,因此报“未定义”错误。
解决方案
方案1:用 this 调用对象内部方法
修改 deleteProject 中的调用逻辑,通过 this 指向当前对象的方法:
deleteProject: async({ user, project }) => { const translationsParams = { user, projectId: project, trkeys: [], }; await this.deleteTranslations(translationsParams); // 改用this调用内部方法 const params = { TableName: table, Key: { PK: getPK('project', user), SK: getSK('project', user, project), }, }; return doDelete(params); },
注意:如果该方法被单独解构出来调用(比如 const { deleteProject } = obj; deleteProject()),this 会丢失指向,此方案不适用。
方案2:提取独立函数
把 deleteTranslations 写成独立函数,再在对象中引用,避免作用域问题:
// 先定义独立的删除翻译函数 const deleteTranslations = async({ user, projectId, trkeys }) => { const deletePromises = trkeys.map(async(trkey) => { const params = { ...getBaseParams(), Key: { PK: getPK('trans', user, projectId), SK: getSK('trans', user, projectId, trkey), }, }; return doDelete(params); }); return Promise.all(deletePromises); }; // 在对象中引用该函数 const yourDBHandlers = { deleteTranslations, deleteProject: async({ user, project }) => { const translationsParams = { user, projectId: project, trkeys: [], }; await deleteTranslations(translationsParams); // 直接调用独立函数 const params = { TableName: table, Key: { PK: getPK('project', user), SK: getSK('project', user, project), }, }; return doDelete(params); }, };
方案3:提前给对象赋值变量
先将对象赋值给变量,内部通过变量调用方法:
const yourDBHandlers = { deleteTranslations: async({ user, projectId, trkeys }) => { const deletePromises = trkeys.map(async(trkey) => { const params = { ...getBaseParams(), Key: { PK: getPK('trans', user, projectId), SK: getSK('trans', user, projectId, trkey), }, }; return doDelete(params); }); return Promise.all(deletePromises); }, deleteProject: async({ user, project }) => { const translationsParams = { user, projectId: project, trkeys: [], }; await yourDBHandlers.deleteTranslations(translationsParams); // 通过对象变量调用方法 const params = { TableName: table, Key: { PK: getPK('project', user), SK: getSK('project', user, project), }, }; return doDelete(params); }, };
额外提示
当前代码中 trkeys 传入的是空数组,deleteTranslations 不会删除任何翻译。要实现“删除项目下所有翻译”的需求,需要先查询该项目对应的所有 trkey,再将这些值传入函数。
内容的提问来源于stack exchange,提问作者shanemcg992
相关产品推荐
相关产品推荐

