Наскоро отстранявах грешки в някои неща, свързани с обещания в 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);
Не е ли подвеждащо?