我有一个要在多个组件中使用的函数。它从组件收集数据并将其存储在db中。我的问题是该函数有很多参数,其中某些参数可能未在某些组件中使用。看看:
export default async function addUserLogs(account, service, terminal,isSaved,isSentToGateway,amount ) {
const obj = {
serviceID: service,
terminalID: terminal,
amountName: account,
amount: amount,
isSaved: isSaved,
isSentToGateway: isSentToGateway,
};
const db = await InitDb();
const tx = db.transaction('userLogs', 'readwrite');
const store = tx.objectStore('userLogs');
const index = await store.put(obj);
let params = {};
if (window.localStorage.getItem('params') !== null) {
params = JSON.parse(window.localStorage.getItem('params'));
}
window.localStorage.setItem(
'params',
JSON.stringify({ ...params, userLogIndex: index })
);
}
例如,我要传递的account和service参数在一个组件上起作用,而其他参数则不是必需的。在另一个组件中,我只需要传递数量参数,但是我需要指定先前的参数以不覆盖其他值。但是出现错误“未定义帐户,服务,终端,isSaved,isSentToGateway”。您能否建议我如何解决该问题
答案 0 :(得分:1)
addUserLogs可以接收带有可选键的对象,并将上一个接收到的对象与新对象合并:
export default async function addUserLogs(newParams) {
const lastParams = <get the last params from storage>;
const obj = Object.assign(lastParams, newParams);
...
}
// usage examples
addUserLogs({amountName: 'x', serviceID: 1, terminalID: 2, isSaved: true ,isSentToGateway: false, amount: 10});
addUserLogs({isSentToGateway: false, amount: 10});
addUserLogs({amountName: 'x', serviceID: 1, terminalID: 2});
如果您想对addUserLogs签名更具声明性,可以执行以下链接:
export default async function addUserLogs({amountName, serviceID, terminalID, isSaved ,isSentToGateway, amount}) {
const lastParams = <get the last params from storage>;
const newParams = {
amountName: amountName || lastParams.amountName,
serviceID: serviceID || lastParams.serviceID,
terminalID: terminalID || lastParams.terminalID,
isSaved: isSaved === undefined ? lastParams.isSaved : isSaved,
isSentToGateway: isSentToGateway === undefined ? lastParams.isSentToGateway : isSentToGateway,
amount: amount === undefined ? lastParams.amount : amount
};
...
}
答案 1 :(得分:0)
为了掌握这一点并使您的函数更通用,您应该为该函数提供默认参数,以便当您在此处不传递任何对象创建时
serviceID: service,
terminalID: terminal,
amountName: account,
amount: amount,
isSaved: isSaved,
isSentToGateway: isSentToGateway,
};
不会中断。为此,请使用以下格式
export default async function addUserLogs(account="default", service = "default", terminal = "default value",isSaved = "default value",isSentToGateway = "default value",amount = "default Value" )
仅为在调用时在其他位置不需要的变量提供默认值。
请注意,当您调用此函数并提供参数时,它们将替换默认值,但是当您不使用该函数时,它将使用默认值,因为这样您的函数不会被未定义的变量破坏
答案 2 :(得分:0)
在该示例中,您可以为一些不需要的参数设置为null,并且在调用函数时不想使用它们。
您可以对参数使用一些过滤器,如下所示:
let data = ...
let url = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("test.gpx")
try data.write(to: url)
let shareController = UIActivityViewController(activityItems:[url], applicationActivities: nil)