在承诺链上返回空箭头功能

时间:2019-02-22 08:56:35

标签: javascript es6-promise arrow-functions

我试图在这里理解一段代码,我认为这是多余的代码,可以将其删除,但也许我错了,这是代码:

return(
    myModule.getSomething(args.url)
    .then(stream => module.uploadData({
      param1: args.param1,
      param2: args.param2,
      param3: stream,
    }))
    .then(() => myBroker.dispatch({
        queueUrl: myQueueUrl,
        payload: JSON.stringify(args.payload),
      })
    )
    .then(msgInfo => {}) .  //This line can be removed right?
    .catch(error => {
      myBroker.dispatch({
        queueUrl: anotherQueueUrl,
        payload: JSON.stringify({ type: 'error', payload: `[ERROR] ${error}` }),
      });

      throw error;
    })
  );

我相信这句话:

.then(msgInfo => {})

可以删除吗?箭头函数什么也没做,msgInfo是调用myBroker.dispatch之后的上一个then子句所返回的东西,因此,我可以删除我刚才提到的行吗?

有人可以给我一个清晰的解释吗? 为什么那条线存在?或解释为什么我不能删除它?

PS:函数getSomething和uploadData返回一个promise,我不确定调度函数,因为它看起来像这样:

return(
    client.sendMessage(parameters).promise()
    .then(data => data)
  );

它仅返回“数据”正确的对象?还是因为它最后包含了then子句,还返回了一个Promise?

这种使用多个'then'和arrow函数的语法符号使我感到困惑,

非常感谢!

1 个答案:

答案 0 :(得分:1)

我能想到的那条行会存在的唯一原因是,如果要使用此整个块的功能在某个地方,使得myBroker.dispatch的解析值不应该(或者最好不要)暴露给消费者的更大功能。例如:

const thisModule = (() => {
  const myBroker = ...;
  function getSomethingAndDispatchBroker() {
    return(
      myModule.getSomething(args.url)
      .then(stream => module.uploadData({
        param1: args.param1,
        param2: args.param2,
        param3: stream,
      }))
      .then(() => myBroker.dispatch({
        queueUrl: myQueueUrl,
        payload: JSON.stringify(args.payload),
      }))
      .then(msgInfo => {})
      .catch(error => {
        myBroker.dispatch({
          queueUrl: anotherQueueUrl,
          payload: JSON.stringify({ type: 'error', payload: `[ERROR] ${error}` }),
        });
        throw error;
      })
    );
  }
  return { getSomethingAndDispatchBroker };
})();

在这里,可以从外部调用函数getSomethingAndDispatchBroker,但是出于隐私或代码的考虑,最好将myBroker.dispatch的解析值保留在thisModule内部清晰-也许您只希望函数的用户知道 Promise是否已解决(如果过程成功),而不必告诉他们不必要的细节。

不过,如果这些都不是问题,那么可以,请随时删除.then(msgInfo => {})行。