【问题标题】:Returning empty arrow function on promise chain在承诺链上返回空箭头函数
【发布时间】:2019-07-16 07:49:30
【问题描述】:

我在这里试图理解一段代码,我认为这是冗余代码,可以删除但可能我错了,这里是代码:

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 是前面的 then 子句在调用 myBroker.dispatch 后返回的东西,正因为如此,我可以删除我提到的行对吗?

有人可以给我一个明确的解释吗? 为什么这条线存在?或者解释一下为什么不能删除?

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

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

它只返回一个“数据”对象,对吗?还是它也返回一个承诺,因为它最后包含 then 子句?

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

提前非常感谢!

【问题讨论】:

  • 不清楚这条线为什么存在。是的,这条线可以去掉。
  • 该函数什么都不做,它返回一个空对象,最终您的顶级 return 语句将用作其返回值。澄清一下,您的顶级回报会返回一个承诺,当一切都说完后,该承诺将解析为 { }。
  • 您可以使用 promise.all 来处理多个 api 调用,例如 here
  • “函数什么都不做,它返回一个空对象,”@JSager。没有。它返回未定义。花括号在这里创建一个块,而不是对象文字。所以这个函数“吞下”msgInfo 并让 promise 被解析为 undefined
  • 我想如果你有一个没有括号的 arg lambda 并且声明了一个块范围,你会得到一个无效的语法错误。

标签: javascript es6-promise arrow-functions


【解决方案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 => {}) 行。

【讨论】:

  • 感谢您的详细解答!我注意到这条线实际上可以被移除,我的情况下不需要它。
猜你喜欢
  • 2018-08-24
  • 1970-01-01
  • 2017-08-26
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
相关资源
最近更新 更多