【问题标题】:Avoid forgotten promise returns避免忘记承诺回报
【发布时间】:2016-03-28 02:03:42
【问题描述】:

当我使用 Promise 来表达作业之间的依赖关系时,解决的值变得不重要了,我可能会在某处忘记返回值。示例:

startSomething().then(function() {
  Q.all(tasks.map(function(task) { return task.startIt(); }))
}).then(collectOutput).done();

Q.all 在这里返回了一个承诺,我应该返回它。不这样做意味着在调用collectOutput 时,所有任务都已启动,但不能保证它们已完成。

这种错误会导致竞争状况,并且可能极难重现和追踪。所以我想知道,是否有一些工具可以帮助检测和避免此类问题?也许一些承诺库会在沿途的函数返回未定义时发出警告?或者像 Bluebird 对未处理的拒绝所做的那样检测没有侦听器的承诺?

【问题讨论】:

  • 值得指出的是,TypeScript 可以在编译时检测到这个“忘记返回”问题。这可能比你想要的改变更大(你要求一个库,你得到了升级语言的建议),但在我个人看来,TypeScript 绝对是一项值得的投资。
  • 我发现使用不带 {} 的箭头函数会有所帮助,因为返回是隐式的。例如。 startSomething().then(() => Q.all(tasks.map(task => task.startIt())))

标签: javascript promise q


【解决方案1】:

实际上,bluebird 会在您在处理程序中创建承诺但没有返回时发出警告。如果你愿意放弃Q。

这里有更多in-depth explanation about bluebird's warnings

警告:在处理程序中创建了一个承诺,但没有从它返回这通常意味着您只是忘记了返回语句

某处会导致未连接到的失控承诺 任何承诺链。

例如:

getUser().then(function(user) {
    getUserData(user);
}).then(function(userData) {
    // userData is undefined
});

【讨论】:

猜你喜欢
  • 2019-09-18
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2023-03-26
  • 2017-02-09
  • 1970-01-01
  • 2018-10-15
相关资源
最近更新 更多