javascript - angular 的 promise 是否具有误导性,因为它们并不总是被异步调用

标签 javascript angularjs promise angular-promise

我最近一直在调试一些与 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/

相关文章:

javascript - 如何仅在 HTML 中按住键时播放视频

javascript - vs代码侧边栏树文件夹结构不起作用

javascript - 使用 Angular js 从日期时间中提取时间

php - 使用 PHP 在 Apache 服务器中部署 WebSockets

javascript - 在遍历 .JSON 时使用 Promise.all()?

javascript - 用bluebird替换Q码

javascript - 使用自动完成文本框从 mysql 数据库获取表记录并显示在文本字段中

html - <!DOCTYPE html> - 文档类型声明只能出现一次

javascript - 如何使用 JavaScript 等待元素存在?

javascript - 为什么这个 vuejs v-for 循环会抛出未定义的错误?