首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即使没有必要,我的ES6类方法是否应该返回承诺呢?

即使没有必要,我的ES6类方法是否应该返回承诺呢?
EN

Stack Overflow用户
提问于 2016-10-11 22:34:58
回答 2查看 94关注 0票数 1

我正在编写一个包含游戏实例的ES6类。它有大约20个方法,其中一半是调用异步函数。它还具有立即计算返回值的方法。这意味着,有时我需要返回一个Promise,有时不需要返回。

现在,我正在考虑更改其余的方法,以返回Promise

优点:更统一的处理回调/返回值的方式 缺点:需要在不一定需要的时候处理Promise。意味着头顶上有一点。

在我看来,这两种变体似乎都很好。我应该使用哪一个,尊重潜在的开发人员同事的可读性和易用性?

EN

回答 2

Stack Overflow用户

发布于 2016-10-12 01:57:08

如果您的操作总是异步的,或者有时是异步的,则返回承诺。

但是,如果您的方法总是同步的,那么返回一个承诺只会使调用方使用该方法变得更加复杂,并且使得使用您的API更加困难。这也会让事情慢一点,因为承诺总是在未来的某个时刻得到解决。并且,将同步操作转换为异步操作可以在不需要的情况下创建竞争条件(这都取决于调用者代码)。

此外,调用方通常应该了解哪些方法是异步的,哪些方法不是异步的--我不认为对调用方隐藏这些方法是一种优势。

因此,在我看来,同步API更容易使用,因此如果API是自然同步的,那么您就不想让它不必要地异步。而且,请记住,同步函数总是可以在承诺链的中间使用,而不需要修改。但是,它可以自己使用,而不需要承诺链,这是开发人员的可用性优势。

API的命名和文档应该非常清楚哪些操作是异步的,哪些操作返回承诺,哪些操作不返回值。

票数 1
EN

Stack Overflow用户

发布于 2016-10-12 23:42:02

将每个同步调用转换为异步调用是一个糟糕的想法,因为您失去了JavaScript中同步单线程编程的主要保证:

  • 任何事情都不能与背景中的状态相混淆。

这就是为什么在JavaScript中不需要锁的原因。您可以调用同步函数,并且对它可以更改和不能更改的内容有确定性的期望,前提是避免全局变量(因为同样的原因而不是全局变量)。

与异步调用形成对比,在异步调用返回时,状态可能已经更改了任意数量的方式。

这就是ES7/8中使用await关键字的原因:

代码语言:javascript
复制
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/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39987827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档