【问题标题】:Synchronise promises in Ember.js在 Ember.js 中同步 Promise
【发布时间】:2014-01-14 23:02:14
【问题描述】:

这似乎是对承诺的滥用或“你做错了”的问题,如果是这样,请纠正我。 我遇到了几个我想要同步在 Ember.js 中默认是异步的调用的地方。这是一个小例子:

class service extends Ember.Object
  someProperty: null

  doSomething: ->
    #this.store was injected during initialisation
    this.store.find("someModel", someSelector).then((result) =>
      @someProperty = result.someField
      console.log "promise fulfilled"
  )

调用以下代码:

service.doSomething()
console.log "this should be second"

将导致:

"this should be second"
"promise fulfilled"

这意味着如果有人调用该方法并期望在调用返回后设置属性 someProperty ,则情况并非如此。我看到的唯一同步方法是将其称为“service.doSomething().then(-> ....)”。这意味着调用者需要知道返回了一个承诺。

有什么方法可以在 doSomething 方法中等待,直到 promise 被解决,然后才返回?

【问题讨论】:

    标签: ember.js coffeescript ember-data promise synchronous


    【解决方案1】:

    这意味着调用者需要知道返回了一个承诺

    调用者显然总是需要知道他们调用的函数返回什么,甚至它需要什么参数。所以你在这里真的没有问题。

    【讨论】:

    • 很公平,这是真的。但是,您会期望某些方法在完成之前会阻塞。我通常在这里看到的问题是,如果您有 4 或 5 个调用需要等待前一个调用完成,则需要分别级联“then”3 或 4 次,这似乎不切实际。我想知道在 jquery ajax 中是否有类似“async:false”标志的东西。有时你只想阻止,直到某事完成。
    • @Tom 级联是什么意思?使用 Promise,您将保持完全平坦,尤其是使用咖啡脚本,您将对同步的代码几乎没有冗长
    • 你说得对,我做了更多的研究并实施了一些测试用例,.. 我认为这更多的是个人偏好问题,来自非基于事件的背景。当我想到那个案例时,我不知何故忽略了“then”没有嵌套。我们现在的解决方案是给返回 Promise 的方法添加后缀,所以任何使用 api 的人都知道这个方法返回的是 Promise 而不是值。感谢您的见解!另一方面,所有同步承诺或事件的实现对我来说都感觉像黑客或非常丑陋。 JS 处理线程的方式似乎不适用于阻塞。
    【解决方案2】:

    正如您已经猜到的,这不是一个好主意。 Javascript 开发完全是关于异步思考和工作,因此您的服务的客户端应该暴露于 Promises 的 API。我认为这是一个公平的要求,因为 Promise 是一个易于学习的概念,可以大大简化异步编程。

    【讨论】:

      猜你喜欢
      • 2019-10-11
      • 1970-01-01
      • 2013-12-29
      • 2018-06-26
      • 2018-07-08
      • 2018-09-29
      • 1970-01-01
      • 2017-11-28
      相关资源
      最近更新 更多