【问题标题】:What is the HTTP promise object in AngularJS?AngularJS 中的 HTTP 承诺对象是什么?
【发布时间】:2016-11-20 14:51:38
【问题描述】:

虽然我在 AngularJS 中使用 HTTP Promise 对象,但我对 HTTP Promise 对象实际上是什么以及 HTTP Promise 对象和 AngularJS 中的传统对象之间的区别没有一个清晰的概念!

有人能解释一下吗?

【问题讨论】:

  • 谢谢!!如果能详细解释就好了!!
  • 你知道“传统对象”和(通用)promise 对象有什么区别吗?

标签: javascript angularjs angular-promise angular-http


【解决方案1】:

Promise 是异步操作的概念。基本上,它代表一个从现在到未来任何时候都可以使用的对象。

它有三种状态:

  • 待处理
  • 已完成(已成功完成)
  • 拒绝(失败)

您使用两种方法处理 Promise 的状态,then() 和 catch()。

then() 会在异步调用成功时为您提供预期的对象,而 catch() 将允许您处理错误。

可能会使用 Promise 的场景是进行网络调用时,例如:

getData(): Promise<Array<string>> {
    return this.http.get("http://a-test-api.com/api/getdata").toPromise();
}

然后你会像这样使用它:

this.getData().then(function (stringArray) {
        self.data = stringArray;
});

您可以在此处找到有关此概念的更多信息:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise

【讨论】:

  • 我认为您在getData 中缺少return
  • "then() 从您的异步调用中返回对象" - 不。
【解决方案2】:

承诺是一个概念。这是关于 AngularJS Promises 的一个问题,它与其他 Promises 有点不同,但跨库的概念基本相同。

什么是异步进程?

如果你知道这是什么,请跳过它并阅读下一个标题,否则:

当你有代码时,它通常按顺序运行,如下所示:

object.method() // First,
variable = "something"; // Second,
for(var i=0; i<2; i++) {
    resp = object.makeHttpRequest();
    console.log(resp.data + " was #" + i);
} // Third,
console.log("Done"); // Last.

每个步骤都在前一个完成之后执行。当for 循环需要很长时间(想象一下HTTP 请求需要很长时间)时,这可能是一个问题。该请求将挂起整个进程,直到 HTTP 请求完成。非常糟糕。

Node.js 默认使用 回调模式 处理此问题。当您调用一个阻塞的函数(需要很长时间,例如读取磁盘上的文件或发出 HTTP 请求)时,您注册了一个 回调函数,它将在之后调用精加工。它会apply 该函数使用来自阻塞函数的数据当它完成时。这允许您在该阻塞函数完成时运行其他代码。

正如许多 Node.js 开发人员会告诉您的那样,这段代码可能会变得非常混乱,速度非常快。相反,AngularJS(和其他库)会在代码完成时返回一个 Promise。它允许您使用Promise Pattern

我知道什么是异步的东西

Promise 在概念上类似于回调,但更简洁并且允许更大程度的控制。考虑一下:

var url = getUrlFunction();
makeHttpRequest(url, function onResponse(data) {
    dataHandler(data);
    console.log("done");
}, function onError(err) {
    errHandler(err);
    console.log("uh oh");
});
showTheUserWeAreLoading();

// Or in node.js

var url = getUrlFunction();
makeHttpRequest(url, function onResponse(err, data) {
    (err) ? handleErr(err): null;
    dataHandler(data);
    console.log("done");
});
showTheUserWeAreLoading();

showTheUserWeAreLoading 函数会(有时)在 HTTP 请求完成之前发生,这不是很直观。在重新阅读您自己的代码时,这还有很多不足之处。

相同的代码,但使用 makeHttpRequest 返回一个承诺:

var url = getUrlFunction(), prom = makeHttpRequest(url);
showTheUserWeAreLoading();
prom.then(function onSuccess(data) {
    dataHandler(data);
    console.log("done");
}, function onError(err) {
    errHandler(err);
    console.log("uh oh");
});

promise 对象有助于跟踪操作的状态。当操作达到以下两种状态之一时,您可以分配处理程序:已完成或已拒绝。

需要注意的是makeHttpRequest是AngularJS中$http()或jQuery中$.ajax的替代。在创建 Promise 标准之前in the ECMAScript standard,每个库(和库版本)对您应该/可以使用哪种模式都有自己的看法。 AngularJS 以前使用 .success(&lt;function&gt;).error(&lt;function&gt;) 命名模式,而 jQuery 使用 .done(&lt;function&gt;).fail(&lt;function&gt;)。这些命名方案在很久以前就被贬低了,因此库之间的当前差异不明显(感谢 ECMAScript)。

【讨论】:

  • 好的,所以你解释了什么是承诺(我们已经对此有疑问),但是你提到的 AngularJS 承诺有什么区别,OP 询问的 http 承诺有什么区别?
  • 以前,返回的 promise 对象对于必须返回的内容没有标准。在 jQuery 1.5-7 中,promise 将使用 .done 回调,AngularJS 将使用 .success 进行回调。这后来被标准化为.then,以使各个库之间的承诺更加一致(以及未来的浏览器实现。
  • 那仍然没有回答问题。
【解决方案3】:

$http API 基于 $q 服务公开的延迟/承诺 API。

1.then(successCallback, [errorCallback], [notifyCallback])

2.catch(errorCallback) – shorthand for promise.then(null, errorCallback)

3.finally(callback, notifyCallback)

$q promise method

【讨论】:

  • 感谢@Hardik Vaghani 的代码和其他人的评论,我从中学到了很多。
猜你喜欢
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
  • 2017-12-18
  • 2015-12-19
  • 1970-01-01
  • 2014-10-05
  • 2016-04-24
  • 1970-01-01
相关资源
最近更新 更多