【问题标题】:Resolving promises from ES6 Arrow Functions解决来自 ES6 箭头函数的承诺
【发布时间】:2018-03-19 16:11:08
【问题描述】:

按照我在 ES6 中的理解阅读文档的含义:

foo => someFun(foo); 

相当于:

foo => { return someFun(foo); }

我正在返回一个新的 Promise,并在该代码中使用箭头函数调用解析和拒绝方法,例如

return new Promise(function(resolve, reject)
{
    someFunThatReturnsAPromise()
    .then(data => resolve(data))
    .catch(err => reject(err));
});

其实 then 中的代码就是这样,

.then(data => return resolve(data))

如果是这样,resolve 的结果(我不确定值的类型)是否重要,我是否应该稍微不那么简洁并使用 {} 编写它以防止隐式返回

.then(data => { resolve(data); })

【问题讨论】:

  • 几个 cmets 已经准确地指出不需要内部的 Promise。因此,请考虑原始问题,但将 then 修改为“.then(data => resolve(data.item))”,即执行一些额外的(尽管是轻微的)处理
  • 无论如何,避免Promise constructor antipattern 并且不要将resolve/reject 作为对承诺的回调传递!

标签: javascript ecmascript-6 es6-promise arrow-functions


【解决方案1】:

resolve 函数已经返回 undefined,所以如果你用单行箭头函数隐式返回它或者根本不从函数体返回它,这绝对没有区别(因为后者意味着你的函数体隐式返回 undefined 本身)。

此外,由于您已将 someFunThatReturnsAPromise() 返回的承诺包装在一个新的承诺中,因此无论如何都没有处理返回的内容,因此即使确实返回了一些东西也没有任何区别。

更重要的是,你将一个 Promise 包装在一个新的 Promise 中的方式是一种反模式。 new Promise() 构造仅用于处理尚未基于 Promise 的异步进程。
由于someFunThatReturnsAPromise() 已经返回了一个promise,你不需要将它包装在一个新的中,只需使用你得到的那个!
对于您的示例,这仅意味着返回它:

return someFunThatReturnsAPromise()

如果你想对数据做一些处理,比如只返回一部分数据(下例中的status属性),你可以在then回调中进行:

return someFunThatReturnsAPromise().then(data => data.status)

当您在 then 回调中返回时,它又会返回一个新的承诺,该承诺会使用您返回的数据解决(除非您返回另一个承诺,在这种情况下,它将在该承诺解决时解决)。
这就是 Promise 的设计方式,通过链接异步进程及其结果。

【讨论】:

  • 太好了。我从您的其他评论中意识到不需要外部 Promise。在我的实际代码中,我已经能够删除其中的一堆,这减少了代码大小。它还解决了外部 Promise 更改 this 的绑定导致各种 const self = this 现在已被删除的问题。谢谢!
【解决方案2】:

如果你只是想返回数据,并在出现错误时拒绝,那么你不需要 then()

return new Promise(function(resolve, reject)
{
    someFunThatReturnsAPromise()
    .then(data => resolve(data))
    .catch(err => reject(err));
});

相当于

return someFunThatReturnsAPromise()

除非你想对数据做一些处理

【讨论】:

  • 不应该是return new Promise ( (reslove, reject) = > { ... } )
  • someFunThatReturnsAPromise() 已经返回了一个 Promise,为什么还要将它包装在另一个 Promise 中?
  • 这是一个有效的问题。在示例代码中,不一定需要它。如果 then 行是:.then(data => resolve(data.item)) say,也许这个例子会好一点
  • @const 除非你想做一些多行处理,否则两者都是等价的。
  • @const return someFunThatReturnsAPromise().then(data => data.item)
猜你喜欢
  • 1970-01-01
  • 2017-08-26
  • 2017-11-07
  • 2019-01-06
  • 1970-01-01
  • 2014-08-10
  • 2021-07-31
  • 2019-07-16
  • 1970-01-01
相关资源
最近更新 更多