我正在使用bluebird在http服务周围设计一些nodejs api包装器。 这个包装器中的许多函数都是异步的,因此从这些实现中返回promise是很有意义的。
我的同事已经在这个项目上工作了几天,有趣的模式正在出现,他也从同步实施的功能中回复了承诺。
示例:
function parseArray(someArray){
var result;
// synchronous implementation
return Promise.resolve(result);
}
我可以看到,如果以后需要使实现异步,这可能会有用,因为您不必重构调用站点。 我想所有方法都是“异步”的,这也很好,但我不确定它到底有多棒。
这被认为是一种不好的做法,我们有什么理由不这样做吗?
答案 0 :(得分:10)
在同步方法中返回promise是没有意义的。
Promises提供了对并发的抽象。当没有涉及并发时,例如提供数组时。返回一个承诺会导致更糟糕的流量控制并且速度相当慢。
这也传达了错误的信息。事实上,毫无理由地宣传事物是一种非常普遍的反模式。
有用的一种情况是当方法可能异步时 - 例如:从缓存中获取某些东西或者如果它不在那里请求它:< / p>
function getData(id){
if(cache.has(id) return Promise.cast(cache.get(id));
return AsyncService.fetch(id).tap(cache.put);
}
答案 1 :(得分:3)
如果我们可以忽略perf,那么只有在使用示例实现时才会这样做:
function parseArray(someArray) {
var result;
// synchronous implementation
return Promise.resolve(result);
}
这个函数很乱,因为它可以同步抛出但也返回一个promise。返回承诺的函数绝不能抛出 - 否则你失去了承诺的大部分好处,因为现在你必须同时使用try-catch
和.catch()
。
正确的实施方式是&#34;注释&#34; .method
的函数:
var parseArray = Promise.method(function() {
var result;
//Promise.resolve(result) is unnecessary now
return result;
});
现在保证函数不会同步抛出,并且可以以一致的方式使用。