如何解决函数中的参数问题

时间:2019-10-02 05:30:35

标签: javascript reactjs vue.js

我有一个要在多个组件中使用的函数。它从组件收集数据并将其存储在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”。您能否建议我如何解决该问题

3 个答案:

答案 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)