【发布时间】: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