【问题标题】:Angular JS $http promise object -- How does it work?Angular JS $http 承诺对象——它是如何工作的?
【发布时间】:2017-04-03 22:08:47
【问题描述】:

所有, 我是 Angular 框架的初学者,一直在阅读 $http 服务。我以为我理解了 Angular JS 中的 Promise 对象,直到我想到了以下问题。你能帮我理解吗?

– 当我从 Angular 进行 REST 调用时,Angular 在执行调用 REST API 的 js 中的其他步骤之前不会进行其余调用。这是因为它是单线程的。好的,我明白了。那么它什么时候执行 REST 调用呢?可能是在当前JS中的所有指令都完成之后?如果是,

  • 为什么我们甚至称它为异步?
  • 其次,在它执行 REST API 期间(假设 REST API 导致输出不早于 2 秒),在它调用 REST API 之后,Angular 是否会等待 2 秒而不做任何事情?

如果 $http 服务一看到就异步执行 REST API,

  • 谁产生了第二个线程来执行 REST API?框架?如果是这样,那么他们是否让 Javascript 不再是单线程的?
  • 其次,当服务返回而主线程甚至还没有完成执行我的 js 中的所有行时,Angular/jQuery 是否会继续执行 .then 函数中编码的指令,而让主线程中的指令等待?

非常感谢您的帮助!

预科

【问题讨论】:

  • "we answer no to rest call"是什么意思?还是单线程。当活动线程处理被清除时将处理响应
  • @charlietfl 我现在已经更新了我的问题,所以很清楚
  • 还应该注意,这些都不是特定于角度的......这完全是关于浏览器处理 ajax (XmlHttpRequest) 请求,相对于大多数事件而言,这些请求可能需要一个永恒的时间

标签: angularjs xmlhttprequest angular-promise angular-http


【解决方案1】:

首先,它不会阻塞执行,它会立即发送请求。基本上它遵循使用回调函数概念的承诺模式。因此,每当 API 返回响应时,它都会调用回调函数并恢复进程。

没有第二个线程这样的概念。当 HTTP 返回响应时,执行不会停止。它只是调用它的回调方法,然后执行剩下的代码行

【讨论】:

    【解决方案2】:

    当我从 Angular 进行 REST 调用时,Angular 在执行调用 REST API 的 js 中的其他步骤之前不会进行其余调用

    没有。这是不正确的。它立即发送请求。但在响应返回之前它不会阻塞,因为这可能会花费大量时间并完全冻结应用程序。因此,它注册了一个回调,稍后将在响应可用时调用此回调。这就是异步的原理。

    谁产生了第二个线程来执行 REST API

    没有第二个线程。

    查看它的最简单方法是将 HTTP 响应视为一个事件,就像单击或按键一样。唯一线程所做的就是等待下一个事件并在循环中对其做出反应。

    【讨论】:

    • 那么,如果解释器正在执行 Javascript 文件中的其他行,它是否会暂停并在 promise 对象解析后返回执行回调?
    • 没有。 HTTP 响应是浏览器在事件队列中发布的一个事件,它会像其他事件一样被 JavaScript 处理。如果您的 JS 有一些无限循环,则无法再处理任何事件,包括 HTTP 响应。当它执行低级 XMLHttpRequest 回调以对收到的响应做出反应时,它本身就是 angular,它解析了 HTTP 承诺。
    猜你喜欢
    • 2013-09-10
    • 2016-02-21
    • 1970-01-01
    • 2016-12-23
    • 2018-09-02
    • 2017-01-20
    • 1970-01-01
    • 2014-04-28
    • 2015-08-26
    相关资源
    最近更新 更多