我最近一直在调试一些与 angular.js 中的 promises 相关的东西,并注意到 angular 将 promises 的决议放入其 evalAsync 循环中,如 this diagram 中所述。 .我的印象是 promise 回调总是异步执行的(作为事件队列中的新事件)。但是,使用 Angular 的机制,如果在摘要周期期间解决了任何 promise ,并且 Angular 在摘要上开始了另一次迭代,则 promise 的回调将在同一执行堆栈中被调用,因为 evalAsync
队列始终是首先检查:
do { // "while dirty" loop
dirty = false;
current = target;
while (asyncQueue.length) {
try {
asyncTask = asyncQueue.shift();
asyncTask.scope.$eval(asyncTask.expression, asyncTask.locals);
} catch (e) {
$exceptionHandler(e);
}
lastDirtyWatch = null;
}
traverseScopesLoop:
do { // "traverse the scopes" loop
...
} while ((current = next));
...
} while (dirty || asyncQueue.length);
是不是误导了?
最佳答案
不确定我是否认为这具有误导性。事实是:
- Promise 回调始终异步执行。在传递给返回的
.then()
之前,它们从未被调用过。
在更大程度上,它们甚至从未从用户代码中调用——按照 Promises/A+ spec 的规定,堆栈上只有“平台代码”。 . - 不能保证每个异步回调都在其自己的事件循环轮次中执行。没有要求两个回调不能共享相同的事件循环周期。毕竟,他们无论如何也无法区分。
在您的情况下,Angular 有资格作为平台代码,它使用自己的“事件循环”——摘要循环。
关于javascript - angular 的 promise 是否具有误导性,因为它们并不总是被异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29718779/