【问题标题】:Resolve promise immediately立即兑现承诺
【发布时间】:2014-10-11 12:12:52
【问题描述】:

是否可以立即解决 Angular Promise 并有效地让代码表现得像一个同步调用?我知道这违背了承诺的目的,但我想这样做是出于单元测试的目的。我的测试表明 then 被立即调用,但我不确定这里是否存在潜在的计时问题,then 仍被视为异步?

function someService(){
  var deferred = $q.defer();
  deferred.resolve(myObj); 
  return deferred.promise;
} 

someService().then(function(obj){
  //will this be executed right away just like it would if this was a synchronous call?

  // more code here under test
});

var myVal = 10;

myVal 赋值会在 then 回调之前执行吗?或者我可以相信 then 总会马上过去吗?

【问题讨论】:

  • 在我看来,通过修改单元测试和实际应用程序执行之间的代码执行路径,这打破了正确单元测试的概念。但是...不覆盖 then 的 angular-promise 实现 -> 不,这将始终异步运行。
  • 关键是要模拟服务并专注于测试然后而不用担心对服务的依赖。我通常会将逻辑分离到一个单独的可测试实体中,但不能在这里更改代码。
  • 文档说无论承诺何时被解决或将被解决这意味着如果结果已经可用,那么“then”也应该立即被调用而无需任何时间或异步问题。
  • 试试scope.$digest()

标签: javascript angularjs angular-promise


【解决方案1】:

您的单元测试可以模拟服务并返回一个承诺;这样你的.then() 就可以被测试了。

类似的问题涵盖了该主题:

要点是:

  • 致电beforeEachinject 模拟您的服务,
  • 你的模拟服务返回一个promise

回到你的问题:

myVal 赋值会在 then 回调之前执行吗?或者可以 我相信 then 总会马上过去吗?

有人 (@gp) 在 cmets 中对此进行了报道。回调是异步的,因此它可能会或可能不会立即执行。为确保您的分配以正确的顺序完成,您可以事先对其进行初始化,或者在then 回调中将它们正确地链接起来。

【讨论】:

  • 是的,就是这样做的,但是 then 仍然是异步调用的,所以除了我真正想要测试的内容之外,似乎测试还需要处理该方面。
  • 问题是为什么你需要它是同步的?另外,如果承诺已经解决,then() 会立即被调用。
  • 这正是我的测试结构,但似乎这可能存在潜在的时序错误,即测试可能在 then 执行之前完成。我没有看到确保所有 then 子句都完成的保障措施。
  • 能否请您提供有关计时错误的更多详细信息?
  • 显然 then 不会在下一个执行,即使 promise 已经解决。它仍然是异步的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
  • 2018-03-27
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多