我正在编写一个包含游戏实例的ES6类。它有大约20个方法,其中一半是调用异步函数。它还具有立即计算返回值的方法。这意味着,有时我需要返回一个Promise,有时不需要返回。
现在,我正在考虑更改其余的方法,以返回Promise。
优点:更统一的处理回调/返回值的方式 缺点:需要在不一定需要的时候处理
Promise。意味着头顶上有一点。
在我看来,这两种变体似乎都很好。我应该使用哪一个,尊重潜在的开发人员同事的可读性和易用性?
发布于 2016-10-12 01:57:08
如果您的操作总是异步的,或者有时是异步的,则返回承诺。
但是,如果您的方法总是同步的,那么返回一个承诺只会使调用方使用该方法变得更加复杂,并且使得使用您的API更加困难。这也会让事情慢一点,因为承诺总是在未来的某个时刻得到解决。并且,将同步操作转换为异步操作可以在不需要的情况下创建竞争条件(这都取决于调用者代码)。
此外,调用方通常应该了解哪些方法是异步的,哪些方法不是异步的--我不认为对调用方隐藏这些方法是一种优势。
因此,在我看来,同步API更容易使用,因此如果API是自然同步的,那么您就不想让它不必要地异步。而且,请记住,同步函数总是可以在承诺链的中间使用,而不需要修改。但是,它可以自己使用,而不需要承诺链,这是开发人员的可用性优势。
API的命名和文档应该非常清楚哪些操作是异步的,哪些操作返回承诺,哪些操作不返回值。
发布于 2016-10-12 23:42:02
将每个同步调用转换为异步调用是一个糟糕的想法,因为您失去了JavaScript中同步单线程编程的主要保证:
这就是为什么在JavaScript中不需要锁的原因。您可以调用同步函数,并且对它可以更改和不能更改的内容有确定性的期望,前提是避免全局变量(因为同样的原因而不是全局变量)。
与异步调用形成对比,在异步调用返回时,状态可能已经更改了任意数量的方式。
这就是ES7/8中使用await关键字的原因:
async function foo(bar) {
if (bar.value == 3) {
let result1 = syncFunction("three");
// bar.value is 3 here guaranteed, provided sub-functions can't access it
let result2 = await asyncFunction("three");
// bar.value (and everything) may have changed by the time we get here.
let result3 = syncFunction2("three"); // bug
return [result1, result2, result3];
}
}有关整个故事,请参见http://calculist.org/blog/2011/12/14/why-coroutines-wont-work-on-the-web/。
https://stackoverflow.com/questions/39987827
复制相似问题