【问题标题】:$q in Angular or Promises in ES6Angular 中的 $q 或 ES6 中的 Promises
【发布时间】:2018-04-05 20:28:05
【问题描述】:

我有一个使用 ES6 和 AngularJS 的项目,据我发现,AngularJS $q 承诺是同步的,但 ES6 承诺不是。正确的? 问题是,有什么区别?什么时候应该使用 $q 或 ES6? 我知道同步和异步有什么区别,但对new PromiseAngularJS $q 感到困惑。

here提出来

【问题讨论】:

  • “$q 承诺是同步的”是什么意思?我不了解 Angular,我也不想,但即使查看他们的文档也对我没有多大帮助。承诺的全部意义不是帮助我们编写异步代码(并避免回调地狱)吗?
  • Right? - 错误。 Promise 根据定义是异步的。 $q 和 ES6 Promises 之间的区别在于 $q Promises(至少几个月前,现在可以修复)不太符合 Promise/A+ 规范
  • $q Promises (at least a few months back) are not quite Promise/A+ spec compliant 是什么意思?
  • @JaromandaX $q promises wrap new Promise
  • @charlietfl - 现在可能是这样,但不是几个月前

标签: javascript angularjs ecmascript-6 angular-promise es6-promise


【解决方案1】:

关于$q 同步性的声明首先适用于带有ngMock 的单元测试。

$q promises 能够在生产环境中同步:

let foo;

$q.resolve().then(() => { foo = 1 });
$rootScope.$digest();
console.log(foo === 1);

并且它们假定在单元测试中是同步的,因为所有负责异步行为的 AngularJS 服务($timeout$http 等)都使用 ngMock 进行模拟,以使测试完全同步:

it('...', inject(($q) => {
    let foo;

    $q.resolve().then(() => { foo = 1 });
    $rootScope.$digest();
    expect(foo).toBe(1);
}));

虽然 ES6 承诺在设计上是异步的,但 then 回调会在下一次运行时运行:

it('...', (done) => {
    let foo;

    Promise.resolve(1).then(() => {
      foo = 1;
      expect(foo).toBe(1);
    })
    .then(done, done.fail);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 2016-06-07
    相关资源
    最近更新 更多