Недавно я отлаживал некоторые вещи, связанные с обещаниями в angular.js, и заметил, что angular помещает разрешения обещаний в свой цикл evalAsync, как показано в эта диаграмма. У меня создалось впечатление, что обратные вызовы обещаний всегда выполняются асинхронно (как новое событие в очереди событий). Однако с механизмом angular возможно, что если какое-либо из обещаний будет разрешено во время цикла дайджеста и angular начнет другую итерацию по дайджесту, обратный вызов для обещания будет вызываться в том же стеке выполнения, поскольку очередь 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);
Разве не вводит в заблуждение?