Angular 中的 $q 或 ES6 中的 Promises

$q in Angular or Promises in ES6

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

here 加注

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

$q promise 能够 在生产中同步:

let foo;

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

并且它们应该在单元测试中是同步的,因为所有 AngularJS 负责异步行为的服务($timeout$http, etc) 被 ngMock 模拟以使测试完全同步:

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

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

虽然 ES6 promises 在设计上是异步的,并且 then 回调在下一个 tick 运行:

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

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