AngularJS中的HTTP承诺对象是什么?

时间:2016-11-20 14:51:39

标签: javascript angularjs angular-promise angular-http

虽然我正在使用AngularJS中的HTTP promise对象,但我并没有清楚地了解HTTP promise对象实际上是什么,以及AngularJS中HTTP promise对象和传统对象之间的区别是什么!

请问有人解释一下吗?

3 个答案:

答案 0 :(得分:9)

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

它有三种状态:

  • 已完成(已成功完成)
  • 拒绝(失败)

使用两种方法处理Promise的状态,然后是()和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

答案 1 :(得分:3)

承诺是一个概念。这是一个关于AngularJS 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的替代。在创建承诺标准in the ECMAScript standard之前,每个库(和库版本)都有自己的意见,您应该/可以使用哪种模式。 AngularJS以前使用.success(<function>).error(<function>)命名模式,而jQuery使用.done(<function>).fail(<function>)。这些命名方案很久以前就被折旧了,因此使得库之间的当前差异变得不明显(谢谢ECMAScript)。

答案 2 :(得分:1)

[Agent Smith] [Morpheus] [Trinity] [Neo] API基于$http服务公开的延迟/承诺API。

1 $q

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

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

$q promise method