Angular 中的 $q 或 ES6 中的 Promises
$q in Angular or Promises in ES6
我有一个使用 ES6 和 AngularJS 的项目,据我发现,AngularJS $q promises 是同步的,但 ES6 promises 不是。正确的?
问题是,有什么区别?什么时候应该使用 $q 或 ES6?
我知道同步和异步之间的区别,但在 new Promise
和 AngularJS $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);
});
我有一个使用 ES6 和 AngularJS 的项目,据我发现,AngularJS $q promises 是同步的,但 ES6 promises 不是。正确的?
问题是,有什么区别?什么时候应该使用 $q 或 ES6?
我知道同步和异步之间的区别,但在 new Promise
和 AngularJS $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);
});