始终返回承诺是否有用

时间:2014-03-18 08:17:46

标签: javascript asynchronous promise api-design

我正在使用bluebird在http服务周围设计一些nodejs api包装器。 这个包装器中的许多函数都是异步的,因此从这些实现中返回promise是很有意义的。

我的同事已经在这个项目上工作了几天,有趣的模式正在出现,他也从同步实施的功能中回复了承诺。

示例:

function parseArray(someArray){
    var result;
    // synchronous implementation
    return Promise.resolve(result);           
}

我可以看到,如果以后需要使实现异步,这可能会有用,因为您不必重构调用站点。 我想所有方法都是“异步”的,这也很好,但我不确定它到底有多棒。

这被认为是一种不好的做法,我们有什么理由不这样做吗?

2 个答案:

答案 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;
});

现在保证函数不会同步抛出,并且可以以一致的方式使用。